Дополнительный выбор, если один результат выбора не является нулевым - PullRequest
0 голосов
/ 11 октября 2019

Меня интересуют результаты, найденные в таблице g, которая разделяет ключ sample_name с таблицами s и l. В этом вопросе таблицы представляют собой
s - выборки,
p - проекты,
l - анализы и
g, анализ г,
все в схемеa.
В интересах оптимизации, я хочу искать таблицу g только после подтверждения того, что l.analysis_g является NOT NULL.

Учитывая : единственная информация, которую я начинаюс именами проектов. Таблица проекта p связана с другими таблицами таблицей образцов s. s связан с каждой таблицей. Таблица l содержит типы анализа, и каждый столбец имеет значение NULL или 1.

В приведенном ниже примере я пытаюсь рассмотреть случай, но я понимаю, что это может быть совершенно неверно.

SELECT s.sample_name,
       s.project_name,
       g.*
FROM a.samples s
JOIN a.analyses l
ON s.sample_name = l.sample_name
JOIN a.analysis_g g
ON s.sample_name = g.sample_name
WHERE s.project_name IN (SELECT p.project_name
                     FROM a.projects p
                     WHERE p.project_name_other
                     IN ('PROJ_1',
                     'PROJ_2'))
;

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Опять же: Пожалуйста, покажите пример! Мы не можем помочь, если нам нужно угадать, но я попробую ...

Если l.analysis_g содержит идентификатор из таблицы g, тогда вы можете просто использовать:

    SELECT * FROM g
    JOIN l on g.id = l.analysis_g
    WHERE blah, blah, blah...

Я удалил ваше предложение WHERE, поскольку вы не предоставили достаточно информации, чтобы позволить кому-либо помочь ее оптимизировать (при необходимости).

0 голосов
/ 11 октября 2019

Тогда, возможно, в предложении where? Все еще очень трудно понять, чего ты хочешь. ,.

SELECT s.sample_name,
       s.project_name,
       g.*
FROM a.samples s
JOIN a.analyses l
ON s.sample_name = l.sample_name
JOIN a.analysis_g g
ON s.sample_name = g.sample_name
WHERE s.project_name IN (SELECT p.project_name
                     FROM a.projects p
                     WHERE p.project_name_other
                     IN ('PROJ_1',
                     'PROJ_2'))
   and l.analysis_g IS NOT NULL
;

В качестве примечания, я думаю, что вы можете присоединиться к p.project_name и избежать предложения where. И я думаю, что вы могли бы хотеть некоторые внутренние соединения - но я не уверен.

SELECT s.sample_name,
       s.project_name,
       g.*
FROM a.samples s
JOIN a.analyses l ON s.sample_name = l.sample_name
JOIN a.analysis_g g ON s.sample_name = g.sample_name
JOIN a.projects p ON s.project_name = p.project_name
WHERE p.project_name_other IN ('PROJ_1', 'PROJ_2')
   and l.analysis_g IS NOT NULL
...