SQL查询-具有公共值的人员

SQL查询-具有公共值的人员,sql,Sql,假设我有一个医院的数据库。 所以我得到了一个包含两列的表:患者ID、治疗ID,并且记录下来,假设我们还有第三个主键列,不管具体是什么。 现在,我想从表中提取所有ID为“1”的患者至少接受了或更多治疗的患者 例如: patients_ID treatment_ID 1 111 1 222 1 333 2

假设我有一个医院的数据库。 所以我得到了一个包含两列的表:患者ID、治疗ID,并且记录下来,假设我们还有第三个主键列,不管具体是什么。 现在,我想从表中提取所有ID为“1”的患者至少接受了或更多治疗的患者

例如:

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