Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从SQL表中选择所有参数集都存在于联接表中的行_Sql_Sql Server_Tsql - Fatal编程技术网

从SQL表中选择所有参数集都存在于联接表中的行

从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

给定以下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 #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);