37

両方の結合に LEFT OUTER JOIN を使用して、3 つのテーブルからデータを取得するクエリがあります。右の 2 つのテーブル (それぞれ処方者と処方箋) に対応するデータがない場合でも、左端 (Salesrep テーブル) の情報を返すクエリが必要です。WHERE 句に日付パラメーターを指定せずにこのクエリを実行すると、期待どおりの結果が得られますが、日付パラメーターを含めるとすぐに、営業担当者に一致するデータがない場合は何も返されません。少なくとも、クエリで要求された 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
4

4 に答える 4

77

制約を結合prescriptions.filldateの条件に移動し、句ONから削除する必要があります。where

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

それ以外の場合、存在しないエントリはprescriptionss nullinprescriptions.filldateになり、WHERE句はそれらを破棄します。

于 2012-09-17T22:07:23.790 に答える
17

ここでは、クエリ処理フェーズについて簡単に説明します (ほとんどの DBMS で一般的です)。OUTER JOINの場合、次のことがわかります。

  1. 最初の CARTESIAN JOIN が生成され、
  2. 行のサブセットを生成する結果セットに対して ON 条件が実行されるよりも、
  3. 外側の行が内側のテーブルの結合された列に NULL で追加された後、
  4. その結果に WHERE 句が適用され、フィルタリングが実行されます。

外部テーブルの行に触れる WHERE 句内に条件を配置すると、それらはすべて破棄されます。その条件は、外側の行が追加される前に評価されるため、ON 句内に配置する必要があります。

したがって、それらの条件:

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

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

于 2012-09-17T22:17:20.810 に答える
0

これは、不等式によって、列に値がない行がprescriptions.filldate除外されているためです。 salesrepprescriptions.filldate

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

于 2012-09-17T22:11:32.930 に答える