如果我有一个表,例如:
name1 | name2 | id |
+----------------+--------------+-----------+
| A | E | 1 |
| A | F | 1 |
| B | G | 1 |
| C | H | 1 |
| D | I | 1 |
| A | J | 2 |
| B | K | 2 |
| C | L | 2 |
| D | M | 2 |
| A | N | 2 |
我需要的是选择id的所有行,其中name2<>'E’
如果我这样做:
selete * from table where name2 <> 'E'
它只给了我这个
name1 | name2 | id |
+----------------+--------------+-----------+
| A | F | 1 |
| B | G | 1 |
| C | H | 1 |
| D | I | 1 |
| A | J | 2 |
| B | K | 2 |
| C | L | 2 |
| D | M | 2 |
| A | N | 2 |
我想要的结果是(不包括至少一次包含name2='E'的id的所有行):
name1 | name2 | id |
+----------------+--------------+-----------+
| A | J | 2 |
| B | K | 2 |
| C | L | 2 |
| D | M | 2 |
| A | N | 2 |
我应该使用哪个查询?
一种方法是使用子查询来查找列name2
中所有值为"E"的ID,然后过滤掉所有这些ID:
SELECT *
FROM table
WHERE id NOT IN
( SELECT DISTINCT id FROM table WHERE name2 = 'E' )
我们可以使用反连接模式:
SELECT t.name1
, t.name2
, t.id
FROM mytable t
LEFT
JOIN mytable q
ON q.id = t.id
AND q.name2 = 'E'
WHERE q.id IS NULL
左外部联接操作表示返回来自t
的所有行,以及来自q
的匹配行。诀窍在于WHERE子句中的条件。对于在q
中找到匹配行的任何行,q.id
的值都保证为非NULL(因为相等比较)。t
中没有匹配行的行将具有q_id的NULL值。因此,这只返回t
中没有q
中匹配行的行将。
SELECT*从table
id不在(从table
id名称2<>'E')
select * from table where name2 != 'E';