首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何选择一个外键与给定值列表完全匹配的主键?

问如何选择一个外键与给定值列表完全匹配的主键?
EN

Stack Overflow用户
提问于 2016-12-26 12:13:07
回答 5查看 1.2K关注 0票数 9

例如:

代码语言:javascript
复制
pk_ref    fk
======    ===
1         a
1         b
1         c
2         a
2         b
2         d

如何执行类似“伪”查询的查询:

代码语言:javascript
复制
select distinc pk_ref
where fk in all('a', 'c');

返回的查询结果必须与列表中外键的所有给定值匹配。

结果应该是:

代码语言:javascript
复制
1

而下面的select语句不能返回任何记录。

代码语言:javascript
复制
select distinc pk_ref
where fk in all('a', 'c', 'd');

我该怎么做?

EN

回答 5

Stack Overflow用户

发布于 2016-12-26 12:19:08

尝尝这个

代码语言:javascript
复制
select pk_ref 
from yourtable 
group by pk_ref 
having count(case when fk = 'a',  then 1 end) >= 1 
and count(case when fk = 'c' then 1 end) >= 1

来动态地完成它。(考虑到您正在使用SQL SERVER)

创建拆分字符串函数并将输入作为逗号分隔值传递

代码语言:javascript
复制
Declare @input varchar(8000)= 'a,c',@cnt int 

set @cnt = len(@input)-len(replace(@input,',','')) + 1

select pk_ref 
from yourtable 
Where fk in (select split_values from udf_splitstring(@input , ','))
group by pk_ref 
having count(Distinct fk) >= @cnt 

您可以通过以下链接创建拆分字符串函数

https://sqlperformance.com/2012/07/t-sql-queries/split-strings

票数 6
EN

Stack Overflow用户

发布于 2016-12-26 13:29:19

:list是输入列表(绑定变量)。length()返回值的差异在于绑定变量中的逗号数量。这个查询,或者其他非常接近它的查询,应该可以在几乎任何DB产品中工作。在Oracle中进行了测试。

代码语言:javascript
复制
select   pk_ref
from     tbl    --  enter your table name here
where    ',' || :list || ','   like   '%,' || fk || ',%'
group by pk_ref
having   count(distinct fk) = 1 + length(:list) - length(replace(:list, ',', ''))
票数 3
EN

Stack Overflow用户

发布于 2016-12-26 12:51:36

如果您可以按设置传递IN运算符值,则可以执行以下操作

模式:

代码语言:javascript
复制
SELECT * INTO #TAB FROM (
SELECT 1 ID, 'a' FK
UNION ALL
SELECT 1, 'b'
UNION ALL
SELECT 1, 'c'
UNION ALL
SELECT 2, 'a'
UNION ALL
SELECT 2, 'b'
UNION ALL
SELECT 2, 'd'
UNION ALL
SELECT 1, 'a'
)AS A

使用CTE将'a‘、'c’设置为

代码语言:javascript
复制
;WITH CTE AS (
SELECT 'a' FK   --Here 'a','c' passed as a Set through CTE
UNION 
SELECT 'c'
)
,FINAL AS(

SELECT DENSE_RANK() OVER (PARTITION BY ID ORDER BY (FK))AS COUNT_ID, ID, FK 
FROM #TAB where FK  IN (select FK FROM CTE)

)
SELECT ID FROM FINAL WHERE COUNT_ID>=(SELECT COUNT( FK) FROM CTE)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41326359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档