【问题标题】: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从 SQL 表中选择标记为 X 或 Y 的记录,但不选择同时具有 X 和 Y 的记录
【发布时间】:2020-03-27 04:17:52
【问题描述】:

我有一张这样的桌子

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

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

创建表格和插入数据的脚本

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

【问题讨论】:

    标签: sql sql-server azure-sql-server


    【解决方案1】:

    假设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

    【讨论】:

    • 对不起,我忘了提这一点..不仅X和Y,C列也可以有其他值。我刚刚通过在 CTE 内部和 CTE 外部给出 'where c in ('X','Y')' 来尝试您的查询,它工作正常......谢谢
    【解决方案2】:

    您可以使用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) 上的索引,这可能具有最佳性能。此外,它还可以让您轻松获取行中的所有列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      相关资源
      最近更新 更多