2011-07-18 9 views
1

私はこのサイトを訪れて、クエリを見つけようとしました。それが何をするのか、私が必要とするのは、テーブル 'データ'を調べて、別の2種類の治療を受けた顧客の名、姓、生年月日を返すことです。diagnosis_locationsできます。サブクエリを使用しないSQLクエリ

SELECT firstname, lastname, date_of_birth 
    FROM `data` 
    WHERE diagnosis_location IN (SELECT DISTINCT Diagnosis_location 
            FROM `data`) 
GROUP BY firstname, lastname, date_of_birth 
    HAVING COUNT(DISTINCT diagnosis_location) >= 2 

しかし、今は同じクエリを使用して、サブクエリを使用せずに同じ結果を得る必要があります。誰も私をここで助けることができますか?または少なくとも私にいくつかの指摘を与える?

+0

_Why_これを行う必要はありませんか? – Oded

+0

はこの宿題ですか? –

+0

これが動作すれば、なぜサブクエリなしでそれが必要になるのですか? –

答えて

2

私はあなたのクエリがdiagnosis_locationフィールドが同じヌルではないので、あなたがそれを持っている方法で結構です WHERE diagnosis_location IS NOT NULL

+1

+1 - 元のクエリが正しく書かれていないようです(なぜ、 'IN'節に' DISTINCT'を使用するのですか?)、難読化されました – JNK

+0

ありがとう、ありがとうございます。この答えは私が探していたものです。 – Tim

+0

@JNK:私にとっては、パズルのように見えました。 – a1ex07

0

としてそれを書き換えることができ、レコードを返す見るものから。これを行う他の唯一の方法は、一時表を使用することです。あなたのテーブルが巨大でない限り、追加された合併症は価値がありません。

EDIT:私はあなたがDiagnosis_locationとdiagnosis_locationという2つの列を持っていると仮定します。それが本当ではなく、あなたがタイプミスをしたなら、この答えは間違っています。

0

あなたはサブクエリなしで書くために探している場合は、結合文を試してみてください。好奇心のうち

SELECT firstname, lastname, date_of_birth   
FROM `data` A   
JOIN `data` B 
ON A.diagnosis_location = B.Diagnosis_location 
GROUP BY firstname, lastname, date_of_birth 
HAVING COUNT(DISTINCT diagnosis_location) >= 2 

、あなたもパフォーマンスの増加を探して参加がうまく動作しない場合、あなたはできるはずですINステートメントの代わりにEXISTSステートメントを試してみてください。

SELECT firstname, lastname, date_of_birth 
FROM `data` A 
WHERE EXISTS 
(SELECT 1 
FROM `data` B 
where B.Diagnosis_location = A.diagnosis_location) 
GROUP BY firstname, lastname, date_of_birth 
HAVING COUNT(DISTINCT diagnosis_location) >= 2 
+0

あなたはSELECT TOP 1 *を意味しますか? – sll

+0

その答えは正しくありません。行のDiagnosis_locationがDiagnosis_locationに存在するが、そのDiagnosis_locationと同じでない場合は、返されません。最初のものになるでしょう –

+0

@sll - SELECT 1は、EXISTSステートメントを使用するときに使用できる少しのトリックです。基本的に「見つかったら真を返す」と言います。 –

関連する問題