Этот вопрос трудно назвать.
По сути, я пытаюсь написать запрос, чтобы получить информацию о файле из таблицы "ste_file", которая соответствует всем записям в таблице "st_chemical".У химической таблицы есть одно прямое соответствие с файловой таблицей (idfile_primary) и две разные "коллекции файлов", к которым у нее есть внешние ключи (clfilecoll_other и clfilecoll_MSDS), и эти внешние ключи соответствуют таблице сбора файлов "ste_filecoll", которая вturn ссылается на несколько файлов в «ste_file», все по столбцу «idfile»
Большинство версий написанного мной запроса никогда не работали - они просто вращались бы бесконечно.Я наконец закончил с этим:
SELECT
c.idchemical,
f.idfile as "id",
f.szname as "name"
from ste_file f, st_chemical c
WHERE f.idfile IN (
SELECT fc.idfile
FROM ste_filecoll fc
WHERE fc.clfilecoll = c.clfilecoll_msds
)
UNION
SELECT
c.idchemical,
f.idfile as "id",
f.szname as "name"
from ste_file f, st_chemical c
WHERE f.idfile IN (
SELECT fc.idfile
FROM ste_filecoll fc
WHERE fc.clfilecoll = c.clfilecoll_other
)
UNION
SELECT
c.idchemical,
f.idfile as "id",
f.szname as "name"
from ste_file f, st_chemical c
WHERE f.idfile = c.idfile_primary;
Это работает, но чувствует себя невероятно неаккуратным - я, вероятно, делаю тонну сканирования стола.Есть ли более чистый способ сделать это?Я перепробовал множество вариантов, например, где я делал UNION внутри предложения WHERE IN, или вообще не пытался объединиться, но все они вообще ничего не возвращали, просто бегали бесконечно.Пример запроса, который НЕ работает:
SELECT
c.idchemical,
f.idfile as "id",
f.szname as "name"
from ste_file f, st_chemical c
WHERE f.idfile IN (
SELECT fc.idfile
FROM ste_filecoll fc
WHERE fc.clfilecoll = c.clfilecoll_msds
UNION
SELECT fc.idfile
FROM ste_filecoll fc
WHERE fc.clfilecoll = c.clfilecoll_other
);
Этот запрос выполняется бесконечно.Любые предложения или идеи, чтобы упростить это?Мне нужно написать много запросов, похожих на этот, и я думаю, что мне не хватает какой-то базовой концепции, которая охватывает это гораздо более четко.