Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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 - Fatal编程技术网

需要sql查询以匹配三个值

需要sql查询以匹配三个值,sql,sql-server,Sql,Sql Server,我有一张像下面这样的桌子 CAccountID CID NetworkID 1 1 1 2 1 2 3 2 1 4 2 2 5 2 3 6 3 1 7 3 2 8 3 3 9

我有一张像下面这样的桌子

CAccountID  CID   NetworkID
1               1      1
2               1      2
3               2      1
4               2      2
5               2      3
6               3      1
7               3      2
8               3      3
9               4      1
10              4      2
我需要一个查询来选择所有具有所有3个NetworkID 1,2,3的CID,而不需要只显示1和2个NetworkID

输出应如下所示

CAccountID  CID  NetworkID
3                2     1
4                2     2
5                2     3
6                3     1
7                3     2
8                3     3
您可以将GROUP BY与JOIN一起使用:

试试这个:

select * from my_table t
where exists(select 1 from my_table
             where CID = t.CID and NetworkID in (1,2,3)
             group by CID
             having count(*) = 3)
select * from <<tablename>> where cid in(select cid from <<tablename>> group by cid having count(*)=3).
试试这个:

select * from my_table t
where exists(select 1 from my_table
             where CID = t.CID and NetworkID in (1,2,3)
             group by CID
             having count(*) = 3)
select * from <<tablename>> where cid in(select cid from <<tablename>> group by cid having count(*)=3).
在这里,子查询将返回表中有3行的所有千个cid

或者,如果您有更多的网络ID,则使用INTERSECT运算符可能会有所帮助:

select * from <<tablename>> where cid in (
   select cid from <<tablename>> where NetworkID=1
   INTERSECT 
   select cid from <<tablename>> where NetworkID=2
   INTERSECT
   select cid from <<tablename>> where NetworkID=3
);
INTERSECT操作符基本上返回查询中的所有公共行。因此,您的数据不可预测性可以通过这种方式处理

尝试xml路径

SELECT *
FROM Table_Name B
WHERE (SELECT [text()] = A.Network FROM Table_Name A WHERE A.CID = B.CID 
ORDER BY CID, CAAccount FOR XML PATH('')) = 123
CTE演示:

; WITH CTE(CAAccount, CID, Network) AS
(
SELECT 1 , 1, 1 UNION ALL
SELECT 2 , 1, 2 UNION ALL
SELECT 3 , 2, 1 UNION ALL
SELECT 4 , 2, 2 UNION ALL
SELECT 5 , 2, 3 UNION ALL
SELECT 6 , 3, 1 UNION ALL
SELECT 7 , 3, 2 UNION ALL
SELECT 8 , 3, 3 UNION ALL
SELECT 9 , 4, 1 UNION ALL
SELECT 10, 4, 2
) SELECT *
FROM CTE B
WHERE (SELECT [text()] = A.Network FROM CTE A WHERE A.CID = B.CID ORDER BY CID, CAAccount FOR XML PATH('')) = 123
输出:

CAAccount   CID Network
3           2   1
4           2   2
5           2   3
6           3   1
7           3   2
8           3   3

嗨,莎玛,谢谢你的回复。我需要所有1,2,3网络ID的CID。。请检查我期望的输出嗨,谢谢你的回复。我需要所有1,2,3网络ID的CID。。请检查输出iexpected@user2986417你试过我的问题吗?它应该返回您想要的结果。不要忘记,您可能应该指定1,2,3中的何处NetworkID,因为数据可能不可预测。1,2,3中的何处NetworkID可能对性能没有帮助。然而,我喜欢您对数据不可预测性的关注,因此,我添加了另一种方法:请提及您的sql server版本。。