1. SQL / Говнокод #27674

    +3

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    INSERT INTO Receipt VALUES ('2', '01.06.2020', 
    (SELECT ProdPrice FROM Products WHERE ProdID=2), 
    (((SELECT ProdPrice FROM Products WHERE ProdID=2)*20)/100), 
    (SELECT ProdPrice FROM Products WHERE ProdID=2)+(((SELECT ProdPrice FROM Products WHERE ProdID=2)*20)/100), '1');
    
    
    ого

    Кровь из глаз. Четыре подзапроса вместо одного, да ещё и имена колонок для вставки не указаны.
    Я уже молчу про то, как считается НДС.

    Запостил: cpubaker, 20 Сентября 2021

    Комментарии (11) RSS

    • Прогрев процессора.
      Ответить
    • Ебатое гавно гыы
      Ответить
    • SQL на столько умный что он сделает один запрос ... так что не вижу проблем
      Ответить
      • лолшто?
        Ответить
        • Старые версии «MySQL» при некоторых условиях (когда можно было гарантировать, что между запросами интересующая информация не меняется) умели кэшировать результаты предыдущего запроса.
          Ответить
          • В данном случае мы видим один запрос, так что оптимизатор действительно может что-то придумать.

            Можно глянуть план ради интереса.
            Ответить
            • То есть поскольку тут подзапросы, даже в транзакцию не надо заворачивать, чтобы помочь СУБД?
              Ответить
              • Не скажу за МайИслам, но в других движках вроде бы всегда авто-транзакция на каждый стейтмент, если ты не начал транзакцию сам.

                З.Ы. Ну и в общем-то удаление одинаковых подзапросов не портит никакую изоляцию, наоборот улучшает.
                Ответить
              • Вообще тут интересный момент... Без оптимизации этот код при уровне изоляции ниже repeatable read может словить гонку с обновлением Products. И в Receipt могут попасть противоречащие друг другу числа.

                А с оптимизацией он уже всегда будет вести себя как repeatable read. И код глючить не будет.

                Т.е. при переезде с умной СУБД на более тупую можно словить весёлые глюки.
                Ответить
          • что значит старые... они по оптимизации запроса идут из одной таблици поэтому будут хешированны на чтение
            Ответить

    Добавить комментарий