从 SQL table 中选择具有标志 X 或 Y 的记录,但不选择同时具有 X 和 Y 的记录

Pick the records which has the flag either X or Y, but not the records which has both X and Y from a SQL table

我有一个table这样的

AID     B       C   
2471    D471    X
2471    D471    Y

2471    E471    X

2471    F471    Y

2472    D471    X
2472    D471    X

2473    E471    Y
2473    E471    Y

2474    F471    Y

我需要通过将 A 和 B 分组来选择具有 X 或 Y 的 AID, 但是当我们按 A 和 B

分组时,它不应该选择具有 X 和 Y 的记录

预期输出

AID     B       C
2471    E471    X

2471    F471    Y

2472    D471    X
2472    D471    X

2473    E471    Y
2473    E471    Y

2474    F471    Y

如果您对此查询有任何疑问,请告诉我。

用于创建 table 和插入数据的脚本

CREATE TABLE tablename
(
    [A] int
    , [B] varchar(10)
    , [C] varchar(5)
);

INSERT INTO tablename
    ([A], [B], [C])
VALUES
    (2471, 'D471', 'X'),
    (2471, 'D471', 'Y'),
    (2471, 'E471', 'X'),
    (2471, 'F471', 'Y'),
    (2472, 'D471', 'X'),
    (2472, 'D471', 'X'),
    (2473, 'E471', 'Y'),
    (2473, 'E471', 'Y'),
    (2474, 'F471', 'Y')
;

假设 C 列只能包含值 XY,您应该能够只检查非重复计数:

WITH cte AS (
    SELECT A, B
    FROM tablename
    GROUP BY A, B
    HAVING COUNT(DISTINCT C) = 1
)

SELECT t1.A, t1.B, t1.C
FROM tablename t1
INNER JOIN cte t2
    ON t1.A = t2.A AND t1.B = t2.B;

Demo

您可以使用 not exists。假设 X 和 Y 是唯一的值:

select t.*
from tablename t
where not exists (select 1
                  from tablename t2
                  where t2.a = t.a and
                        t2.b = t.b and
                        t2.c <> t.c
                 );

对于 tablename(a, b, c) 上的索引,这可能具有最佳性能。此外,它还可以让您轻松获取行中的所有列。