2012-03-23 12 views
1

私は、異なるロールコードの総患者数を引き出すために継承した2つのクエリを持っていますが、問題は同じ数を返していることです - テーブルの1対多の関係のためにDISTINCTがこれを生成していることがわかりました以下で説明するが、隔離するためにクエリに追加条件を追加する方法がわからないよ:1(結果は、理論的には、クエリ1(結果は、理論的にははるかに大きくする必要があります)どのようにMySQL DISTINCT(COUNT)を返す異なる条件の同じ行数ですか?

SELECT count(DISTINCT p.patient) 
FROM react r 
INNER JOIN CasesR cr 
ON cr.globalid = r.globalid 
LEFT JOIN profile p 
ON cr.globalid = p.globalid 
WHERE r.desc = 'A' 
SELECT count(DISTINCT p.patient) 
FROM react r 
INNER JOIN CasesR cr 
ON cr.globalid = r.globalid 
LEFT JOIN profile p 
ON cr.globalid = p.globalid 
WHERE r.desc = 'A' 
AND cr.rcode = 'PS' 

小さくする必要があります

クエリ

それでは、どのように本当のカウントを取得するには、このクエリを変更することができますか?キーフィールド

rrecordid (PK) 
globalid (Multiples in table IE: rrecordid=1,globalid=122; rrecordid=2,globalid=333) 
desc (Multiples in table IE: rrecordid=1,globalid=122; rrecordid=2,globalid=333) 

CasesRキーフィールド

crecordid (PK) 
globalid 
(Multiples in table IE: crecordid=1,globalid=122;crecordid=2,globalid=333) 
rcode (enum: 'A','B','C','D') 
(multiples, globalid=122;rcode=A; globalid=122;rcode=B) 

プロフィールキーフィールド

globalid (PK) 
patient (Multiples in table IE: globalid=1,patient=122;globalid=2,patient=122) 

を反応させますか上記のコメントがでてきているものを一緒に持参する

おかげ

+1

2つの異なるクエリとその違いを示すサンプルデータを掲載して、期待される結果を含めることはできますか? – liquorvicar

+1

AND cr.rcode = 'PS'を使った小集合の理論は、すべての患者がrcodeとして 'PS'を持つ場合、保証されません。 – DRapp

+1

ところで、 'LEFT JOIN'はNULLではないので、' INNER JOIN'で置き換えることができます。 'p.patient' – newtover

答えて

0

。 。 。あなたの質問です。

(1)desc = 'A'(2)rcode = 'PS'casesrにおける対応するレコードを持っているとreactにおける対応するレコードを持っているすべてのprofileレコードを検索します(AND cr.rcode = 'PS'付き)あなたの最初のクエリは、この手段。 profileレコードの「patient」フィールドにはいくつの異なる値がありますか?

その制限#2はちょうど「casesrに該当するレコードを持っている」ために「rcode = 'PS'casesrに該当するレコードを持っている」から変更された以外(AND cr.rcode = 'PS'なし)あなたの2番目のクエリは、同じことを意味します。当然のことながら、これは緩い制限なので、より小さい値を返すことはありません値;確かにと同じの値が得られます。

これらのクエリを継承したとします。あなたはそれらを書いた人が実際にはで、通常同じ結果を与えるためにを意図していないと確信していますか? patientが最初のクエリのわずかな追加要件を満たさずに2番目のクエリのすべての要件を満たすことはかなり珍しいかもしれません。

関連する問題