![](/img/trans.png)
[英]Exclude all rows if same value in column a is found multiple times in a table
[英]Exclude rows based on column value when second column value is found
我尝试搜索此内容,但我不确定如何准确表达我所追求的内容,但是我将展示我所拥有的和我想要的。 这也是我的第一个问题,如果您遇到任何问题,我深表歉意!
首先,我有一个带有外键的链接表:
|ID|Value|
+--+-----+
|1 | 70|
|1 | 130|
|2 | 60|
现在,我试图向我显示此表中Value!=70
所有ID。 我试过了;
SELECT * FROM table WHERE Value != 70
这将删除70值,现在将显示行1:130
和2:60
。 但是我将如何排除匹配的列中的所有值。 例如,如果我说不给我显示任何与它们关联的值为70的ID,则我应该只获取ID为2的行。 我试过了;
SELECT DISTINCT * FROM table WHERE Value != 70
和
SELECT * FROM table WHERE Value != 70 GROUP BY ID
和
SELECT DISTINCT * FROM table WHERE Value != 70 GROUP BY ID
但这些都不起作用。 就像我说过的那样,我不确定该如何表达自己的意思,但是任何帮助将不胜感激。
Select * From table
where id Not In
(Select distinct id
From table
Where value = 70)
要么
Select * From table t
where Not exists
(Select * From table
where id = t.id
and value = 70)
您可以使用子查询和NOT IN
条件
SELECT tb.* FROM table tb
WHERE tb.ID NOT IN
(
SELECT a.ID FROM table a where a.Value = 70
)
我不知道我是否了解您,但这也许是吗?
SELECT * FROM table WHERE ID NOT IN (
SELECT ID FROM table WHERE Value = 70
)
我使用'NOT IN'而不是!=
因为它可能是多个ID,其关联值为70。
您也可以使用:
SELECT * FROM table t1 WHERE NOT EXISTS(
SELECT 1 FROM table t2 WHERE t2.ID = t1.ID AND t2.value = 70
)
您的第二次尝试非常接近解决此问题的一种方法。 仅需将where
子句更改为having
子句(以及对逻辑的少量更改):
SELECT ID
FROM table t
GROUP BY ID
HAVING sum(Value = 70) = 0;
having
子句中的表达式计算value
等于70
的行数。 您不希望有这样的行,因此= 70
。 这种查询形式非常灵活。 使用hading子句可以检查更复杂的条件,例如不具有70
或71
:
HAVING sum(Value = 70) = 0 AND
sum(Value = 71) = 0;
或不具有70
但具有71
:
HAVING sum(Value = 70) = 0 AND
sum(Value = 71) > 0;
以及更复杂的组合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.