Проблема левого соединения SQL - PullRequest
1 голос
/ 11 августа 2011

Я создаю программу в стиле контрольного списка, в которой файлы назначаются контрольным спискам, а вы проверяете элементы контрольных списков для определенных файлов. Я пытаюсь выполнить запрос, который возвращает все файлы, ГОТОВЫ для определенного элемента контрольного списка (элементы упорядочены).

Так, например, я пытаюсь увидеть, какие файлы готовы для элемента контрольного списка № 3, поэтому мне нужно найти все файлы, которые были помечены как проверенные для элемента № 2, НО НЕ для элемента № 3.

Я бы также предпочел НЕ использовать подзапросы, хотя я знаю, что подзапросы решат эту проблему (вот почему это занимает много времени), так как этот запрос будет выполняться для каждого элемента контрольного списка, и я чувствую, что Подзапросы здесь могут негативно повлиять на производительность.

Вот мой запрос:

SELECT
    DISTINCT f.filename, f.id
FROM
    files f LEFT JOIN checklist_item_checklist cic1 LEFT JOIN checklist_check cc1 ON
    cc1.checklist_item_checklist_id = cic1.checklist_item_checklist_id ON
    cc1.file_id != f.id,checklist_item_checklist cic2,
    checklist_check cc2
WHERE
    cic1.checklist_item_checklist_id = 2 AND
    cic2.order_number = cic1.order_number - 1 AND
    cic1.checklist_id = cic2.checklist_id AND
    cc2.checklist_item_checklist_id = cic2.checklist_item_checklist_id AND
    cc2.file_id = f.id

Структура таблицы:

файлы

  • id (PK)
  • имя файла

checklist_item_checklist

  • checklist_item_checklist_id (PK)
  • ORDER_NUMBER

checklist_check

  • file_id (FK to files.id)
  • checklist_item_checklist_id (от FK до checklist_item_checklist.checklist_item_checklist_id)

Спасибо!

1 Ответ

1 голос
/ 11 августа 2011

В вашем запросе много синтаксических ошибок.Я считаю, что вам нужен подзапрос.

Это должно работать:

SELECT f.id, f.filename
FROM files f 
JOIN checklist_check cc ON cc.file_id = f.id
JOIN checklist_item_checklist cic ON cic.checklist_item_checklist_id = cc.checklist_item_checklist_id AND cc.order_number = 2
WHERE f.id not in(
    SELECT f.id,
    FROM files f 
    JOIN checklist_check cc ON cc.file_id = f.id
    JOIN checklist_item_checklist cic ON cic.checklist_item_checklist_id = cc.checklist_item_checklist_id AND cc.order_number = 3)
...