【问题标题】:Select ALL records with fieldvalue1 if any records (with fieldvalue1) have fieldvalue3 have a specific value如果任何记录(具有字段值 1)具有字段值 3 具有特定值,则选择具有字段值 1 的所有记录
【发布时间】:2019-09-20 19:53:24
【问题描述】:
如果其中任何一条记录具有另一个特定值,我需要显示特定值的所有记录。本质上,如果 field3 = 'b',那么 field1 是什么?显示值为 field1 的所有记录,无论其 field3 值如何。
Record Number External Id Letter
1 123456 a
2 123456 b
3 123456 c
4 456852 t
5 456852 b
记录 2 的字母值为 'b' - 所以我想查看 externalid,即 123456,现在我想提取外部 id 的所有记录,无论其他记录的字母值是否为 'b'
【问题讨论】:
标签:
sql
sql-server
tsql
sql-server-2008
【解决方案1】:
使用EXISTS 和相关子查询:
SELECT *
FROM mytable t
WHERE
t.letter = 'b'
OR EXISTS (
SELECT 1
FROM mytable t1
WHERE
t1.record_number != t.record_number
AND t1.external_id = t.external_id
AND t1.letter = 'b'
)
另一种选择是使用窗口函数:
SELECT record_number, external_id, letter
FROM (
SELECT
t.*,
MAX(CASE WHEN letter = 'b' THEN 1 END) OVER(PARTITION BY external_id) mx
FROM mytable t
) x WHERE mx = 1
Demo on DB Fiddle:
记录号 |外部标识 |信
------------: | ----------: | :-----
1 | 123456 |一种
2 | 123456 | b
3 | 123456 | C
4 | 456852 |吨
5 | 456852 | b
【解决方案2】:
使用exists,但不用担心在外部查询中过滤:
select t.*
from t
where exists (select 1
from t t2
where t2.external_id = t.external_id and t2.letter = 'b'
);
在(external_id, letter) 上有一个索引,我希望它有很好的性能。