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

    −865.7

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    SELECT *
    FROM `table`
    WHERE `parent_id` = NULL
    OR `parent_id` IN (
        SELECT `id` FROM `table` WHERE `parent_id` = NULL
    )

    Страная оптимизация запроса

    Запостил: guest, 03 Марта 2009

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

    • test:
      >>`parent_id` = NULL
      `parent_id` is NULL!!!
      Ответить
    • Гость:
      IS будет работать медленее чем явное указание потому как будет производится тест на boolean выражения, соль не в этом, child запрос дублирует root запрос то есть у нас идет сначало проверка первого условия а затем и второго которое фактически его дублирует, то что там есть индексы это конечно хорошо, вот только логическое или сначало выполнит полностью первый запрос а потом второй и толку от child запроса 0
      Ответить
    • Иван:
      Если это запрос MySQL, то `parent_id` = NULL будет не правильно работать
      Ответить
    • Капитан Очевидность:
      это ShitQL? :))
      Ответить
    • Запрос рабочий - он выбирает первый и второй уровень дерева.
      И подзапрос вполне корректный, #2 - ошибаешься, что он дублирует основной.
      Другое дело - можно было сделать лучше и оптимальнее, но клеймить говнокодом?..
      Ответить
    • Какой движок?
      =/IS NULL и IN будут по разному работать.
      Ответить
    • Так какая СУБД?
      в Firebird например любое сравнение с NULL возвращает false, для этого используется IS.

      Для трехуровнего дерева работать не будет очевидно. Хороший говнокод :)
      Ответить
    • В Oracle и в любой СУБД, которая правильно поддерживает ANSI SQL, parent_id = NULL будет равно false всегда.
      Тут же явно MySQL, но и в нем не факт, что в старших версиях это будет работать.
      Ответить
      • Может и будет. MySql может работать по стандарту ANSI, если задать специальный флаг.
        Ответить

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