选择查询以按列值排除

时间:2017-10-20 16:18:18

标签: sql sql-server-2005

如何选择所有代码值不是651,652,655,656的唯一ID的记录。

包含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

我想检索所有记录,其中并非所有代码都是651/652/655/656之一的ID

结果数据集如下所示

ID Line Code 
2 1 650 
2 2 652 
3 1 651 
3 2 655 
3 3 651 
3 4 658 

3 个答案:

答案 0 :(得分:2)

试试这个:

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 server 2005仍然相同)

| ID | Line | Code |
|----|------|------|
|  2 |    1 |  650 |
|  2 |    2 |  652 |
|  3 |    1 |  651 |
|  3 |    2 |  655 |
|  3 |    3 |  651 |
|  3 |    4 |  658 |

答案 1 :(得分:0)

您可以检查哪些代码不在lineitem的值中。 这可以通过子查询来完成。例如:

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)
              )

答案 2 :(得分:0)

这是一种不使用IN或Exists的方法。它利用子查询中的条件聚合来确定每个ID是否存在比不需要的代码更多的记录,然后再连接回原始表以获取更多详细信息。

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