2017-11-29 7 views
-1

私は病院のデータベースを持っていると言います。 so ..私は2列のテーブルを持っています:patients_ID、treatment_IDとレコードのために、別の3番目のプライマリキー列があると言うと、正確には関係ありません。 今、私はテーブルからすべてのpatient_IDを抽出したいと思います。少なくとも1つのIDが '1'の患者の治療をすべて受けています。SQL照会 - 共通の値を持つ人

例えば

patients_ID 
    5 

原因は、彼だけは、患者IDと同じ治療を持って:あなたは、私は、テーブルを返すために、私のクエリを望む上の表から、見ることができるように

patients_ID   treatment_ID 

    1      111 
    1      222 
    1      333 
    2      111 
    2      333 
    5      111 
    5      222 
    5      333 
    5      444 

= 1、そして私は彼がそれに加えて治療444を受けても気にしない。

patient_id = 2は治療法「222」がないために属していません。

答えて

0
SELECT 
    patients.id 
FROM 
(
    SELECT treatment_id FROM yourTable WHERE patients_id = 1 
) 
    filter 
CROSS JOIN 
    patients -- A table with all patients 
LEFT JOIN 
    yourTable 
     ON yourTable.treatment_id = filter.treatment_id 
     AND yourTable.patients_id = patients.id 
WHERE 
    patients.id <> 1 
GROUP BY 
    patients.id 
HAVING 
    COUNT(filter.treatment_id) = COUNT(yourTable.treatment_id) 

(あなたは患者テーブルを持っていない場合、あなたは本当に1を持っている必要があり、1を作成する必要があります。しかし、あなたは最後の手段として(SELECT patients_id FROM yourTable GROUP BY patients_id)を使用することができます。)

か。 ...

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) 
+0

私のクエリはbtwで動作しません。今修正しています... – MatBailie

+0

は同じものにコメントするつもりでした。あなたが編集すると、私は投稿しません。 –

+0

@VamsiPrabhalaはあなたの投稿を投稿してくれます。もっと良い/違う/もっと教育的かもしれません... – MatBailie

0

患者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) 
+0

Errrの場合、 't1.patient_id = 1'を' WHERE'節に移動する必要があります。 'LEFT JOIN'を述語として持つことは、' t1'がフィルタリングされていないことを意味し、その結果、テーブル全体がそれ自身に結合されます。 – MatBailie

0

このスクリプトでは、少なくとも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 
関連する問題