Я был бы очень признателен, если бы вы могли помочь мне со следующим запросом; Имея следующие таблицы:

----------
**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) в выбранном

-1
viruskimera 16 Авг 2019 в 17:24

2 ответа

Лучший ответ

Если у вас есть список шаблонов, и вы хотите, чтобы результаты, которые его содержат, вы можете использовать агрегацию. Например:

select resultid
from resultpatterns rp
where pattern in (?, ?, ?)
group by resultid
having count(distinct pattern) = 3;  -- 3 is the size of the list
1
Gordon Linoff 16 Авг 2019 в 14:27

Это случай . Для ровно двух заданных «шаблонов», как в вашем примере, и исходя из некоторых предположений, это должно быть 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')

Предположения:

«Лучший способ» зависит от отсутствующих требований. Существует много возможных способов:

1
Erwin Brandstetter 16 Авг 2019 в 16:36