Select 行基于字段值
Select rows based on field values
我有这个结构
CREATE TABLE #Test
(
Field1 VARCHAR(10),
Field2 VARCHAR(10)
)
INSERT #Test VALUES('AAA','NO'),
('BBB','NO'),
('BBB','YES'),
('BBB','SURE'),
('CCC','NO'),
('DDD','NO'),
('DDD','YES'),
('DDD','ALWAYS')
SELECT * FROM #Test
每个不同的 Field1
值都有 Field2
'NO'。
我想 select 来自 #Test
的所有行,这样如果不同的 Field1
值有多个 Field2
值,return 除了带有 Field2
的行之外的所有内容='NO',否则 return 具有 'NO' 值。
所以结果应该是这个
AAA 只有 'NO',所以我们 return 它,BBB 有多个,所以 return 除了 'NO'。
我想在一条语句中 select 它,而不删除 等。我尝试 ROW_NUMBER()
按 Field1
分区,但这并没有解决问题。
不存在:
SELECT * FROM #Test t
WHERE t.Field2 <> 'NO'
OR NOT EXISTS (SELECT 1 FROM #Test WHERE Field1 = t.Field1 AND Field2 <> 'NO')
参见demo。
结果:
> Field1 | Field2
> :----- | :-----
> AAA | NO
> BBB | YES
> BBB | SURE
> CCC | NO
> DDD | YES
> DDD | ALWAYS
希望这个例子对你有帮助。
select Field1,Field2 from #Test where Field1 not in(SELECT Field1 FROM #Test where Field2<>'NO')
UNION ALL
SELECT Field1,Field2 FROM #Test where Field2<>'NO'
order by Field1
您可以使用 window 函数:
SELECT t.Field1, t.Field2
FROM (SELECT t.*,
SUM(CASE WHEN FIELD2 = 'NO' THEN 1 ELSE 0 END) OVER (PARTITION BY FIELD1) AS NO_FLAG,
COUNT(*) OVER (PARTITION BY FIELD1) AS CNT
FROM Test t
) t
WHERE (CNT <> NO_FLAG AND FIELD2 <> 'NO') OR
(CNT = NO_FLAG AND FIELD2 = 'NO');
这里是demo.
我有这个结构
CREATE TABLE #Test
(
Field1 VARCHAR(10),
Field2 VARCHAR(10)
)
INSERT #Test VALUES('AAA','NO'),
('BBB','NO'),
('BBB','YES'),
('BBB','SURE'),
('CCC','NO'),
('DDD','NO'),
('DDD','YES'),
('DDD','ALWAYS')
SELECT * FROM #Test
每个不同的 Field1
值都有 Field2
'NO'。
我想 select 来自 #Test
的所有行,这样如果不同的 Field1
值有多个 Field2
值,return 除了带有 Field2
的行之外的所有内容='NO',否则 return 具有 'NO' 值。
所以结果应该是这个
AAA 只有 'NO',所以我们 return 它,BBB 有多个,所以 return 除了 'NO'。
我想在一条语句中 select 它,而不删除 等。我尝试 ROW_NUMBER()
按 Field1
分区,但这并没有解决问题。
不存在:
SELECT * FROM #Test t
WHERE t.Field2 <> 'NO'
OR NOT EXISTS (SELECT 1 FROM #Test WHERE Field1 = t.Field1 AND Field2 <> 'NO')
参见demo。
结果:
> Field1 | Field2
> :----- | :-----
> AAA | NO
> BBB | YES
> BBB | SURE
> CCC | NO
> DDD | YES
> DDD | ALWAYS
希望这个例子对你有帮助。
select Field1,Field2 from #Test where Field1 not in(SELECT Field1 FROM #Test where Field2<>'NO')
UNION ALL
SELECT Field1,Field2 FROM #Test where Field2<>'NO'
order by Field1
您可以使用 window 函数:
SELECT t.Field1, t.Field2
FROM (SELECT t.*,
SUM(CASE WHEN FIELD2 = 'NO' THEN 1 ELSE 0 END) OVER (PARTITION BY FIELD1) AS NO_FLAG,
COUNT(*) OVER (PARTITION BY FIELD1) AS CNT
FROM Test t
) t
WHERE (CNT <> NO_FLAG AND FIELD2 <> 'NO') OR
(CNT = NO_FLAG AND FIELD2 = 'NO');
这里是demo.