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
这是relational-division的一个案例。
对于恰好两个给定的 "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
如果您能帮助我解决以下问题,我将不胜感激;有下表:
----------
**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
这是relational-division的一个案例。 对于恰好两个给定的 "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