SQL:Select 仅当多个值位于 CatalogTable 的 1 列中时

SQL: Select only if multiple values are IN 1 column from CatalogTable

如果您能帮助我解决以下问题,我将不胜感激;有下表:

----------
**TableResults**
ResultId1
ResultId2
----------

---------------------
**TableResultsPatterns**
ResultId1  pattern1
ResultId1  pattern2
ResultId1  pattern4
ResultId2  pattern3
---------------------

---------------------
**TablePatterns**
pattern1 Name1
pattern2 Name2
pattern3 Name3
pattern4 Name4

---------------------

检查值列表(来自用户的模式名称)的最佳方法是什么 位于或存在于特定结果的模式列表中

例如 select 只有具有模式 Names(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(每个 TableResult 的 PAtternNAmes)在 select

如果您有一个模式列表并且想要包含这些模式的结果,则可以使用聚合。例如:

select resultid
from resultpatterns rp
where pattern in (?, ?, ?)
group by resultid
having count(distinct pattern) = 3;  -- 3 is the size of the list

这是的一个案例。 对于恰好两个给定的 "patterns" 就像在你的例子中,并且基于一些假设,这应该是 fastest:

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')

假设:

  • 您只需要 SELECT 列表中的 resultid
  • 您已准备好必要的索引,因此我们不会进行顺序扫描。
  • 你知道给定模式的数量。
  • 此处概述的标准 m:n 实施:
    • How to implement a many-to-many relationship in PostgreSQL?
  • patterns.name 定义为 UNIQUE.

"best way" 取决于缺少的要求。有许多种可能的方式:

  • How to filter SQL results in a has-many-through relation