Я был бы очень признателен, если бы вы могли помочь мне со следующим запросом; Имея следующие таблицы:
----------
**TableResults**
ResultId1
ResultId2
----------
---------------------
**TableResultsPatterns**
ResultId1 pattern1
ResultId1 pattern2
ResultId1 pattern4
ResultId2 pattern3
---------------------
---------------------
**TablePatterns**
pattern1 Name1
pattern2 Name2
pattern3 Name3
pattern4 Name4
---------------------
Каков наилучший способ проверить, является ли список значений (имена шаблонов от пользователя) IN или существует в списке шаблонов конкретного результата
Например, выберите только результаты с именами шаблонов (Name2, Name3)? У меня есть что-то вроде:
SELECT***
JOINs***
WHERE***
and exists(select TablePatterns from TableResultsPatterns left join
TablePatterns f on TableResultsPatterns.patternId = f.id
where TableResultsPatterns.ResultsId = ResultIdX and patternName in ('Name2', 'Name4'))
GROUPBY***
***
Изменить 1:
----------------
**TableResults**
(ResultId pk)
ResultId1
ResultId2
---------------
--------------------------------------------------------
**TableResultsPatterns**
(ResultId (fk TablePatterns.PatternId)
fk TableResults.ResultId)
ResultId1 pattern1
ResultId1 pattern2
ResultId1 pattern4
ResultId2 pattern3
--------------------------------------------------------
------------------------------
**TablePatterns**
(PatternId pk) (PatternName)
pattern1 Name1
pattern2 Name2
pattern3 Name3
pattern4 Name4
------------------------------
В моем основном запросе у меня есть:
right join TableResults wsr on wsr.patient_well_sample_id=XXX.id
left join TableResultsPatterns wsrfp on wsr.ResultId=wsrfp.ResultId
left join TablePatterns fp on wsrfp.final_patterns_id=fp.id
Примечание: я - string_agg (PAtternNAmes для каждого TableResult) в выбранном
2 ответа
Если у вас есть список шаблонов, и вы хотите, чтобы результаты, которые его содержат, вы можете использовать агрегацию. Например:
select resultid
from resultpatterns rp
where pattern in (?, ?, ?)
group by resultid
having count(distinct pattern) = 3; -- 3 is the size of the list
Это случай реляционного разделения . Для ровно двух заданных «шаблонов», как в вашем примере, и исходя из некоторых предположений, это должно быть fasttest :
SELECT resultid
FROM resultpatterns t1
JOIN resultpatterns t2 USING (resultid)
WHERE t1.pattern = (SELECT pattern FROM patterns WHERE name = 'Name2')
AND t2.pattern = (SELECT pattern FROM patterns WHERE name = 'Name3')
Предположения:
- Вам нужен только
resultid
в спискеSELECT
. - У вас есть необходимые индексы, поэтому мы не спускаемся в последовательное сканирование.
- Вы знаете количество заданных шаблонов.
- Стандартная реализация m: n, описанная здесь:
patterns.name
определенUNIQUE
.
«Лучший способ» зависит от отсутствующих требований. Существует много возможных способов:
Похожие вопросы
Связанные вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.