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