2012-09-17 40 views
21

両方の結合でLEFT OUTER JOINを使用して3つのテーブルからデータを取得するクエリがあります。右の2つのテーブル(それぞれ処方箋と処方箋)に対応するデータがない場合でも、左端の(Salesrepテーブル)情報を返すクエリが必要です。 WHERE句の日付パラメータを指定しないでこのクエリを実行すると、予想されるリターンが得られますが、日付パラメータを含めると、salesrepの一致するデータがない場合は何も返されません。少なくとも、クエリで要求されたsalesrepテーブルの列を確認する必要があります。左外部結合が機能していませんか?

ここにクエリがあります...どんなヘルプも非常に高く評価されています。

SELECT salesrep.salesrepid as SalesRepID, 
     salesrep.fname as SalesrepFName, 
     salesrep.lname as SalesRepLName, 
     salesrep.fname+' '+salesrep.lname as SalesRepFullName, 
     prescriber.dea_no as PDeaNo, 
     prescriber.lname+', '+prescriber.fname as DocName, 
     CONVERT(VARCHAR(8), prescriptions.filldate, 1) as FillDate, 
     prescriptions.drugname as DrugName, 
     prescriptions.daysupply as Supply, 
     prescriptions.qtydisp as QtyDisp, 
     prescriptions.rx_no as Refill, 
     prescriptions.copay as Sample, 
     ROUND(prescriptions.AgreedToPay-(prescriptions.AgreedToPay*.07),2) as AgreedToPay, 
     prescriptions.carrierid as CarrierID 
FROM salesrep 
    LEFT OUTER JOIN prescriber on salesrep.salesrepid = prescriber.salesrepid 
    LEFT OUTER JOIN prescriptions on prescriber.dea_no = prescriptions.dea_no 
    WHERE salesrep.salesrepid = 143 AND 
     prescriptions.filldate >= '09-01-12' AND 
     prescriptions.filldate <= '09-17-12' 
ORDER BY prescriptions.filldate 
+1

DBMSとは何ですか? (オフトピックですが、私はドラッグ代理店&ドラッグ産業を嫌います) – Kermit

+3

@njk(トピック外)これは、業界に対する強いメディアバイアスを考慮して、全く驚くことではありません:) – dasblinkenlight

答えて

53

ジョインのON状態にprescriptions.filldate上の制約を移動し、where句から削除する必要があります、それ以外の場合は

LEFT OUTER JOIN prescriptions ON prescriber.dea_no = prescriptions.dea_no 
          AND prescriptions.filldate >= '09-01-12' 
          AND prescriptions.filldate <= '09-17-12' 

prescriptionsnullとそこに終わるんされているのエントリをsがprescriptions.filldateにあり、WHERE句がそれらを捨てます。

+0

ありがとうdasblinkenlight! – jgiven

0

これは、prescriptions.filldateの不等号が、prescriptions.filldate列の値を持たないsalesrepの行を除外しているためです。

NULL値がある場合(右側のテーブルの一致するデータがない場合)、nullは2つの日付の間にはないため、salesrepデータを含む行全体が日付フィルタによってフィルタされます。

11

Hereについては、ほとんどのDBMSに共通するクエリ処理の段階について簡単に説明しています。あなたは、そこに見つけるOUTERのそれは、JOIN:

  1. 最初デカルト生成されるJOIN、ON状態より
  2. 行の結果セット生成サブセット上で実行される、
  3. 外側の列を用いて追加された後より内部テーブルの結合された列にNULLがある場合、フィルタリングを実行するWHERE句が適用されます。

あなたは、彼らがすべて破棄されている外側のテーブルの行に触れるWHERE句内の条件を置きます。 ON句内にその条件を配置するだけで、外側の行が追加される前に評価されます。

ので、これらの条件:

prescriptions.filldate >= '09-01-12' AND 
prescriptions.filldate <= '09-17-12' 

は、ON句に移動する必要があります。

関連する問題