Select 查询以按列值排除分组
Select query to exclude group by column values
我如何 select 所有代码值都不是 651、652、655、656 的唯一 ID 的所有记录。
来源 table 有 3 列
ID Line Code
1 1 651
1 2 652
1 3 655
2 1 650
2 2 652
3 1 651
3 2 655
3 3 651
3 4 658
4 1 651
4 2 651
我想检索并非所有代码都是 ID 的 651/652/655/656 之一的所有记录
结果数据集如下所示
ID Line Code
2 1 650
2 2 652
3 1 651
3 2 655
3 3 651
3 4 658
试试这个:
SELECT t1.*
FROM table1 as t1
INNER JOIN
(
SELECT DISTINCT ID
FROM table1 AS t1
LEFT JOIN
(
SELECT 651 AS code UNION SELECT 652 UNION
SELECT 655 UNION SELECT 656
) AS t2 ON t1.code = t2.code
WHERE t2.code is NULL
) AS t2 ON t1.id = t2.id;
demo
*(mysql 的演示,但对于 sql 服务器 2005 仍然相同)
| ID | Line | Code |
|----|------|------|
| 2 | 1 | 650 |
| 2 | 2 | 652 |
| 3 | 1 | 651 |
| 3 | 2 | 655 |
| 3 | 3 | 651 |
| 3 | 4 | 658 |
您将检查哪些代码不在行项目的那些值中。
这可以通过子查询来完成。例如:
DECLARE @temp TABLE (ID int, Line int, Code int)
INSERT INTO @temp VALUES
(1, 1, 651),(1, 2, 652),(1, 3, 655),(2, 1, 650),(2, 2, 652),(3, 1, 651)
,(3, 2, 655),(3, 3, 651),(3, 4, 658),(4, 1, 651),(4, 2, 651)
SELECT ID, Line, Code
FROM @temp T1
WHERE EXISTS (SELECT *
FROM @temp T2
WHERE T2.ID = T1.ID
AND T2.Code NOT IN (651, 652, 655, 656)
)
这是一种不使用 IN 或 Exists 的方法。它利用子查询中的条件聚合来确定每个 ID 是否存在比不需要的代码更多的记录,然后返回到原始 table 以获取更多详细信息。
DECLARE @Table AS TABLE (ID int, Line INT, Code INT)
INSERT INTO @Table (ID, Line, Code)
VALUES (1, 1, 651),(1, 2, 652),(1, 3, 655),(2, 1, 650),(2, 2, 652)
,(3, 1, 651),(3, 2, 655),(3, 3, 651),(3, 4, 658),(4, 1, 651)
,(4, 2, 651)
SELECT t1.*
FROM
@Table t1
INNER JOIN (
SELECT
ID
FROM
@Table
GROUP BY
ID
HAVING
COUNT(*) > COUNT(CASE WHEN Code = 651 OR Code = 652 OR Code = 655 OR Code = 656 THEN Code END)) t2
ON t1.ID = t2.ID
我如何 select 所有代码值都不是 651、652、655、656 的唯一 ID 的所有记录。
来源 table 有 3 列
ID Line Code
1 1 651
1 2 652
1 3 655
2 1 650
2 2 652
3 1 651
3 2 655
3 3 651
3 4 658
4 1 651
4 2 651
我想检索并非所有代码都是 ID 的 651/652/655/656 之一的所有记录
结果数据集如下所示
ID Line Code
2 1 650
2 2 652
3 1 651
3 2 655
3 3 651
3 4 658
试试这个:
SELECT t1.*
FROM table1 as t1
INNER JOIN
(
SELECT DISTINCT ID
FROM table1 AS t1
LEFT JOIN
(
SELECT 651 AS code UNION SELECT 652 UNION
SELECT 655 UNION SELECT 656
) AS t2 ON t1.code = t2.code
WHERE t2.code is NULL
) AS t2 ON t1.id = t2.id;
demo *(mysql 的演示,但对于 sql 服务器 2005 仍然相同)
| ID | Line | Code |
|----|------|------|
| 2 | 1 | 650 |
| 2 | 2 | 652 |
| 3 | 1 | 651 |
| 3 | 2 | 655 |
| 3 | 3 | 651 |
| 3 | 4 | 658 |
您将检查哪些代码不在行项目的那些值中。 这可以通过子查询来完成。例如:
DECLARE @temp TABLE (ID int, Line int, Code int)
INSERT INTO @temp VALUES
(1, 1, 651),(1, 2, 652),(1, 3, 655),(2, 1, 650),(2, 2, 652),(3, 1, 651)
,(3, 2, 655),(3, 3, 651),(3, 4, 658),(4, 1, 651),(4, 2, 651)
SELECT ID, Line, Code
FROM @temp T1
WHERE EXISTS (SELECT *
FROM @temp T2
WHERE T2.ID = T1.ID
AND T2.Code NOT IN (651, 652, 655, 656)
)
这是一种不使用 IN 或 Exists 的方法。它利用子查询中的条件聚合来确定每个 ID 是否存在比不需要的代码更多的记录,然后返回到原始 table 以获取更多详细信息。
DECLARE @Table AS TABLE (ID int, Line INT, Code INT)
INSERT INTO @Table (ID, Line, Code)
VALUES (1, 1, 651),(1, 2, 652),(1, 3, 655),(2, 1, 650),(2, 2, 652)
,(3, 1, 651),(3, 2, 655),(3, 3, 651),(3, 4, 658),(4, 1, 651)
,(4, 2, 651)
SELECT t1.*
FROM
@Table t1
INNER JOIN (
SELECT
ID
FROM
@Table
GROUP BY
ID
HAVING
COUNT(*) > COUNT(CASE WHEN Code = 651 OR Code = 652 OR Code = 655 OR Code = 656 THEN Code END)) t2
ON t1.ID = t2.ID