从SQL表中选择所有参数集都存在于联接表中的行
给定以下SQL Server架构:从SQL表中选择所有参数集都存在于联接表中的行,sql,sql-server,tsql,Sql,Sql Server,Tsql,给定以下SQL Server架构: CREATE TABLE #TableA (Id int); CREATE TABLE #TableB (Id int, TableA_Id int, Status_Id int) CREATE TABLE #Statuses (Id int) SELECT * FROM #TableA AS A INNER JOIN #TableB AS B ON A.Id = B.TableA_Id INNER JOIN
CREATE TABLE #TableA (Id int);
CREATE TABLE #TableB (Id int, TableA_Id int, Status_Id int)
CREATE TABLE #Statuses (Id int)
SELECT
*
FROM
#TableA AS A
INNER JOIN #TableB AS B
ON A.Id = B.TableA_Id
INNER JOIN #Statuses AS S
ON B.Status_Id = S.Id
如何获取TableA中的所有行,其中dbo.status中的每一行至少有一个条目
例如,在以下数据集中,只应返回TableA的第2行:
#TableA
[1]
[2]
[3]
[4]
#Statuses
[1]
[2]
[3]
#TableB
[1][1][1]
[2][1][3]
[3][2][1]
[4][2][2]
[5][2][3]
[6][3][1]
您可以使用一个简单的where子句来实现这一点。假设TableB中的status列只有有效的状态值:
select a.*
from #TableA a
where (select count(*) from statuses) =
(select count(distinct status) from #TableB b where b.TableA_Id = a.id);
你可以放松这个假设。这里有一个方法:
select a.*
from #TableA a join
(select count(*) as numstatuses from #statuses) s
where (select count(distinct b.status)
from #TableB b join
#statuses s
on b.id = s.id
where b.TableA_Id = a.id
) = numstatuses
:
搜索LEFT Join谢谢,但我没有提到的是TableB可能有重复项,这意味着如果有4个相同的,它仍将返回该行,即使它不包含所有唯一值,DISTINCT将解决该问题,但Lamak已经给出了答案。再次感谢
select a.*
from #TableA a join
(select count(*) as numstatuses from #statuses) s
where (select count(distinct b.status)
from #TableB b join
#statuses s
on b.id = s.id
where b.TableA_Id = a.id
) = numstatuses
SELECT TableA_Id
FROM TableB
GROUP BY TableA_Id
HAVING COUNT(*) >= (SELECT COUNT(*) FROM Statuses);