使用复合主键查询 table,排除特定行
Query table with composite primary key, excluding specific rows
product_id | category
---------------------
1 | A
1 | B
2 | A
3 | B
我想知道哪些唯一 ID 属于类别 A 但不属于类别 B。
在上面的示例中,只有 id: 2
是有效结果
我想出了这个,但没有按预期工作:
SELECT id
FROM table
WHERE category = 'A' AND category <> 'B'
GROUP BY id
一个有效的方法是使用子查询
SELECT id
FROM table
WHERE category = 'A'
AND id NOT IN (SELECT id
FROM table
WHERE category = 'B')
是否可以通过单个查询完成此操作?
使用 self-join:
SELECT t1.id
FROM table AS t1
LEFT JOIN table AS t2 ON t1.id = t2.id AND t2.category = 'B'
WHERE t1.category = 'A' and t2.id IS NULL
另一种方法是分组:
SELECT id
FROM table
WHERE category IN ('A', 'B')
GROUP BY id
HAVING MAX(category) = 'A'
在 HAVING
子句中使用聚合和条件:
SELECT id
FROM tablename
GROUP BY id
HAVING SUM(category = 'A') > 0
AND SUM(category = 'B') = 0;
或:
SELECT id
FROM tablename
WHERE category IN ('A', 'B')
GROUP BY id
HAVING SUM(category = 'B') = 0;
product_id | category
---------------------
1 | A
1 | B
2 | A
3 | B
我想知道哪些唯一 ID 属于类别 A 但不属于类别 B。
在上面的示例中,只有 id: 2
是有效结果
我想出了这个,但没有按预期工作:
SELECT id
FROM table
WHERE category = 'A' AND category <> 'B'
GROUP BY id
一个有效的方法是使用子查询
SELECT id
FROM table
WHERE category = 'A'
AND id NOT IN (SELECT id
FROM table
WHERE category = 'B')
是否可以通过单个查询完成此操作?
使用 self-join:
SELECT t1.id
FROM table AS t1
LEFT JOIN table AS t2 ON t1.id = t2.id AND t2.category = 'B'
WHERE t1.category = 'A' and t2.id IS NULL
另一种方法是分组:
SELECT id
FROM table
WHERE category IN ('A', 'B')
GROUP BY id
HAVING MAX(category) = 'A'
在 HAVING
子句中使用聚合和条件:
SELECT id
FROM tablename
GROUP BY id
HAVING SUM(category = 'A') > 0
AND SUM(category = 'B') = 0;
或:
SELECT id
FROM tablename
WHERE category IN ('A', 'B')
GROUP BY id
HAVING SUM(category = 'B') = 0;