如果我有一个表,如:
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 |
Run Code Online (Sandbox Code Playgroud)
我需要的是选择id的所有行,其中name2 <>'E'
如果我做:
selete * from table where name2 <> 'E'
Run Code Online (Sandbox Code Playgroud)
它只给了我这个
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 |
Run Code Online (Sandbox Code Playgroud)
我想要的结果是(排除包含name2 ='E'的所有id行至少一次):
name1 | name2 | id |
+----------------+--------------+-----------+
| A | J | 2 |
| B | K | 2 |
| C | L | 2 |
| D | M | 2 |
| A | N | 2 |
Run Code Online (Sandbox Code Playgroud)
我应该使用哪个查询?
一种方法是使用子查询查找列中具有值"E"的所有ID,name2然后过滤掉所有这些ID:
SELECT *
FROM table
WHERE id NOT IN
( SELECT DISTINCT id FROM table WHERE name2 = 'E' )
Run Code Online (Sandbox Code Playgroud)