Несколько столбцов внешнего ключа соответствуют условиям внутри "WHERE x.xxx IN" - PullRequest
0 голосов
/ 05 февраля 2019

Этот вопрос трудно назвать.

По сути, я пытаюсь написать запрос, чтобы получить информацию о файле из таблицы "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
);

Этот запрос выполняется бесконечно.Любые предложения или идеи, чтобы упростить это?Мне нужно написать много запросов, похожих на этот, и я думаю, что мне не хватает какой-то базовой концепции, которая охватывает это гораздо более четко.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Если у вас 12c или более поздняя версия, вы можете попробовать это:

SELECT c.idchemical,
       f.idfile as "id",
       f.szname as "name"
FROM  ste_chemical c 
CROSS APPLY ( SELECT fc.idfile 
              FROM ste_filecoll fc 
              WHERE fc.clfilecol1 IN ( c.clfilecol1_msds, c.clfilecol1_other )
              UNION
              SELECT c.idfile_primary idfile FROM DUAL ) fc
INNER JOIN ste_file f ON f.idfile = fc.idfile;

Иногда я нахожу CROSS APPLY полезным, когда у меня необычные условия соединения, подобные этому.

0 голосов
/ 05 февраля 2019

Ну, это немного сложно, не видя модель данных и образец данных, но как насчет этого?

SELECT
    c.idchemical,
    f.idfile id,
    f.szname name
from ste_file f, st_chemical c
WHERE exists (
        SELECT null
        FROM ste_filecoll fc
        WHERE (
            (fc.idfile = f.idfile) and
            (fc.clfilecoll = c.clfilecoll_msds or fc.clfilecoll = c.clfilecoll_other)
        ) 
    ) 
or f.idfile = c.idfile_primary

Может быть, это намеренно, но вы также пропускаете соединение между ste_file f, st_chemical c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...