我需要实现一个函数,它返回安装不属于的所有网络。
以下是我的表格,例如,如果我的安装ID为1,并且我需要安装不属于的所有网络ID,那么结果将仅为[9]
。
network_id | installation_id
-------------------------------
1 | 1
3 | 1
2 | 1
2 | 2
9 | 2
2 | 3
我知道这可以通过连接查询来解决,但我不确定如何为同一个表实现它。这是我迄今为止所尝试过的。
select * from network_installations where installation_id = 1;
network_id | installation_id
-------------------------------
1 | 1
2 | 1
3 | 1
select * from network_installations where installation_id != 1;
network_id | installation_id
-------------------------------
9 | 2
2 | 2
2 | 3
两个表的交集将产生预期的答案,即[9]
。但是虽然我们有union
,但{mys}中没有intersect
。找到上述两个查询的intersection
的解决方案或使用single query using join
实现它的提示将非常感激。
答案 0 :(得分:1)
执行此操作的最佳方法是使用network
表(我认为存在):
select n.*
from network n
where not exists (select 1
from network_installation ni
where ni.network_id = n.network_id and
ni.installation_id = 1
);
如果您以某种方式没有网络表,则可以将from
子句替换为:
from (select distinct network_id from network_installation) n
编辑:
您可以在没有子查询的单个查询中执行此操作,但join
是多余的。只需使用group by
:
select ni.network_id
from network_installation ni
group by ni.network_id
having sum(ni.installation_id = 1) = 0;
having
子句计算每个网络ID的给定安装的匹配数。 = 0
表示没有。
答案 1 :(得分:1)
使用OUTER JOIN
的另一种解决方案:
SELECT t1.network_id, t1.installation_id, t2.network_id, t2.installation_id
FROM tab t1 LEFT JOIN tab t2
ON t1.network_id = t2.network_id AND t2.installation_id = 1
WHERE t2.network_id IS NULL
查看
答案 2 :(得分:0)
select *
from network_installations
where network_id in
(select network_id
from network_installations
where installation_id = 1
group by network_id )