2017-10-20 117 views
0

如何选择所有代码值不是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 

回答

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 | 
+0

@RasmusDybkjær - 谢谢,我编辑了我的答案。 – 2017-10-20 16:25:04

+0

@RasmusDybkjær'IN()'在2005年当然是可用的... –

+0

在子查询中的条件聚合将是另一种选择 – Matt

0

您将检查那里为于订单的价值存在不代码。 这可以通过子查询完成。例如:

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

这里是不使用IN或已存在的方法。它利用子查询中的条件聚合来确定每个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