SQL select 多列中存在多个值
SQL select multiple values present in multiple columns
我有两个表 DiagnosisCodes 和 DiagnosisConditions,如下所示。我需要找到同时患有高血压和糖尿病的成员 (ID)。这里的问题是 DiagnosisCodes 分布在 10 列中。如何检查会员是否符合这两个条件
诊断代码
+----+-------+-------+-------+-----+--------+
| ID | Diag1 | Diag2 | Diag3 | ... | Diag10 |
+----+-------+-------+-------+-----+--------+
| A | 2502 | 2593 | NULL | ... | NULL |
| B | 2F93 | 2509 | 2593 | ... | NULL |
| C | C257 | 2509 | C6375 | ... | NULL |
+----+-------+-------+-------+-----+--------+
诊断条件
+------+--------------+
| Code | Condition |
+------+--------------+
| 2502 | Hypertension |
| 2593 | Diabetes |
| 2509 | Diabetes |
| 2F93 | Hypertension |
| 2673 | HeartFailure |
+------+--------------+
预期结果
+---------+
| Members |
+---------+
| A |
| B |
+---------+
如何查询以检查多个列中存在的多个值。您建议使用 EXISTS
吗?
SELECT DISTINCT id
FROM diagnosiscodes
WHERE ( diag1, diag2...diag10 ) IN (SELECT code
FROM diagnosiscondition
WHERE condition IN ( 'Hypertension','Diabetes' )
)
这是一种反透视数据的方法
SELECT DISTINCT id
FROM yourtable
CROSS apply (VALUES (Diag1),(Diag2),..(Diag10))tc(Diag)
WHERE Diag IN (SELECT code
FROM diagnosiscondition
WHERE condition IN ( 'Hypertension', 'Diabetes' ) group by code having count(distinct condition)=2)
我会使用 group by
和 having
:
select dc.id
from diagnosiscodes dc join
diagnosiscondistions dcon
on dcon.code in (dc.diag1, dc.diag2, . . . )
group by id
having sum(case when dcon.condition = 'diabetes' then 1 else 0 end) > 0 and
sum(case when dcon.condition = 'Hypertension' then 1 else 0 end) > 0;
然后,你应该修复你的数据结构。具有由数字区分的相同信息的单独列通常是数据结构不佳的标志。你应该有一个 table,叫做 PatientDiagnoses
,每个病人和诊断一行。
我有两个表 DiagnosisCodes 和 DiagnosisConditions,如下所示。我需要找到同时患有高血压和糖尿病的成员 (ID)。这里的问题是 DiagnosisCodes 分布在 10 列中。如何检查会员是否符合这两个条件
诊断代码
+----+-------+-------+-------+-----+--------+
| ID | Diag1 | Diag2 | Diag3 | ... | Diag10 |
+----+-------+-------+-------+-----+--------+
| A | 2502 | 2593 | NULL | ... | NULL |
| B | 2F93 | 2509 | 2593 | ... | NULL |
| C | C257 | 2509 | C6375 | ... | NULL |
+----+-------+-------+-------+-----+--------+
诊断条件
+------+--------------+
| Code | Condition |
+------+--------------+
| 2502 | Hypertension |
| 2593 | Diabetes |
| 2509 | Diabetes |
| 2F93 | Hypertension |
| 2673 | HeartFailure |
+------+--------------+
预期结果
+---------+
| Members |
+---------+
| A |
| B |
+---------+
如何查询以检查多个列中存在的多个值。您建议使用 EXISTS
吗?
SELECT DISTINCT id
FROM diagnosiscodes
WHERE ( diag1, diag2...diag10 ) IN (SELECT code
FROM diagnosiscondition
WHERE condition IN ( 'Hypertension','Diabetes' )
)
这是一种反透视数据的方法
SELECT DISTINCT id
FROM yourtable
CROSS apply (VALUES (Diag1),(Diag2),..(Diag10))tc(Diag)
WHERE Diag IN (SELECT code
FROM diagnosiscondition
WHERE condition IN ( 'Hypertension', 'Diabetes' ) group by code having count(distinct condition)=2)
我会使用 group by
和 having
:
select dc.id
from diagnosiscodes dc join
diagnosiscondistions dcon
on dcon.code in (dc.diag1, dc.diag2, . . . )
group by id
having sum(case when dcon.condition = 'diabetes' then 1 else 0 end) > 0 and
sum(case when dcon.condition = 'Hypertension' then 1 else 0 end) > 0;
然后,你应该修复你的数据结构。具有由数字区分的相同信息的单独列通常是数据结构不佳的标志。你应该有一个 table,叫做 PatientDiagnoses
,每个病人和诊断一行。