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