SQL查询-具有公共值的人员
假设我有一个医院的数据库。 所以我得到了一个包含两列的表:患者ID、治疗ID,并且记录下来,假设我们还有第三个主键列,不管具体是什么。 现在,我想从表中提取所有ID为“1”的患者至少接受了或更多治疗的患者 例如:SQL查询-具有公共值的人员,sql,Sql,假设我有一个医院的数据库。 所以我得到了一个包含两列的表:患者ID、治疗ID,并且记录下来,假设我们还有第三个主键列,不管具体是什么。 现在,我想从表中提取所有ID为“1”的患者至少接受了或更多治疗的患者 例如: patients_ID treatment_ID 1 111 1 222 1 333 2
patients_ID treatment_ID
1 111
1 222
1 333
2 111
2 333
5 111
5 222
5 333
5 444
如您所见,从上面的表中,我希望我的查询返回以下表:
patients_ID
5
因为只有他接受了与患者id=1相同的治疗,我不在乎他是否也接受了除此之外的444治疗
患者_id=2不属于该患者,因为他错过了治疗222。获取患者1的所有治疗,将此与除1以外的所有其他患者交叉加入,然后左加入原始表格,检查相同的治疗计数
select p.patient_id
from (select treatment_id from tbl where patient_id=1) t
cross join (select distinct patient_id from tbl where patient_id<>1) p
left join tbl on tbl.patient_id=p.patient_id and t.treatment_id=tbl.treatment_id
group by p.patient_id
having count(t.treatment_id) = count(tbl.treatment_id)
使用此脚本,您不仅可以测试每个患者1至少接受过一次治疗的患者,还可以测试任何其他患者。例如,通过设置@patient_id=2,您应该得到1和5,以此类推。我还试着用它来摆弄唱片,效果很好
--MSSQL variable declaration
declare @patient_id int;
--MySQL variable declaration and value assignment
--MSSQL value assignment
set @patient_id = 1;
select patients_id as cnt from patients as t
inner join
(select distinct treatment_id from patients where patients_id =
@patient_id) as tr on tr.treatment_id = t.treatment_id
group by patients_id
having count(distinct t.treatment_id) = (select count(distinct
treatment_id) from patients where patients_id = @patient_id)
and patients_id <> @patient_id
呃,您需要将t1.patient_id=1移动到WHERE子句。将其作为左联接的谓词意味着t1未被过滤,导致整个表与其自身联接。我正要对其进行注释。。如果您进行编辑,我将不会发布我的。@VamsiPrabhala发布您的,可能比我的更好/不同/更受教育…@VamsiPrabhala您需要取消删除它@MatBailie第一个查询不会给出您期望的结果。它将返回id为2和5的患者。第二个查询将返回预期结果patients_id 5。但如果患者2接受了333次治疗,结果将是患者2和5。无法保证这两个查询中的任何一个都会返回预期的结果……所有ID为“1”的患者至少接受了所有治疗。@EmilioCeroleni在我在您评论之前18分钟进行编辑之前是这样的,当时我评论说它不起作用。但包含两个答案的编辑似乎都能正常工作。
SELECT
yourTable.patients_id
FROM
(
SELECT treatment_id FROM yourTable WHERE patients_id = 1
)
filter
INNER JOIN
yourTable
ON yourTable.treatment_id = filter.treatment_id
WHERE
yourTable.patients_id <> 1
GROUP BY
yourTable.patients_id
HAVING
COUNT(yourTable.treatment_id) = (SELECT COUNT(*) FROM yourTable WHERE patients_id = 1)
--MSSQL variable declaration
declare @patient_id int;
--MySQL variable declaration and value assignment
--MSSQL value assignment
set @patient_id = 1;
select patients_id as cnt from patients as t
inner join
(select distinct treatment_id from patients where patients_id =
@patient_id) as tr on tr.treatment_id = t.treatment_id
group by patients_id
having count(distinct t.treatment_id) = (select count(distinct
treatment_id) from patients where patients_id = @patient_id)
and patients_id <> @patient_id