从 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
列只能包含值 X
和 Y
,您应该能够只检查非重复计数:
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;
您可以使用 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)
上的索引,这可能具有最佳性能。此外,它还可以让您轻松获取行中的所有列。
我有一个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
列只能包含值 X
和 Y
,您应该能够只检查非重复计数:
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;
您可以使用 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)
上的索引,这可能具有最佳性能。此外,它还可以让您轻松获取行中的所有列。