2016-07-06 4 views
0

次のSQLでは、location_ID = 5のバウチャーのみを検索していました。どのようにコード化できますか?1つの場所にアクセスする場合のみ選択する必要があります

SELECT "Vouchers"."Patient_ID", "vwGenPatInfo"."Patient_Number", 
     "Practitioners"."Practitioner_ID", "Practitioners"."First_Name", 
     "Practitioners"."Last_Name", "vwGenPatInfo"."Patient_First_Name", 
     "vwGenPatInfo"."Patient_Last_Name", "vwGenPatInfo"."Patient_DOB", 
     "vwGenPatInfo"."Patient_Sex", "Vouchers"."Carrier_ID", 
     "Vouchers"."Billing_Date", "Vouchers"."Patient_Policy_ID", 
     "Vouchers"."Location_ID" 
FROM ("Ntier_70751"."PM"."vwGenPatInfo" "vwGenPatInfo" 
INNER JOIN "Ntier_70751"."PM"."Vouchers" "Vouchers" 
ON "vwGenPatInfo"."Account_ID"="Vouchers"."Account_ID") 
INNER JOIN "Ntier_70751"."PM"."Practitioners" "Practitioners" 
ON "Vouchers"."Actual_Prov_Practitioner_ID"="Practitioners"."Practitioner_ID" 
-- 
WHERE "Vouchers"."Location_ID"=5 
+2

です。サンプルデータと望ましい結果を入力してください。また、テーブルのエイリアスを使用して、クエリの書き込みと読み込みが容易になるようにしてください。また、テーブルとカラムの名前をエスケープしないでください。 –

+0

'Location_ID'グループの条件付き集約を' Patient_Id'で行います。 –

答えて

2

ここでこれを行う方法の1つです。私も不要な二重引用符をすべて取り除き、適切なエイリアスを使用しました。

SELECT V.Patient_ID 
    , gpi.Patient_Number 
    , P.Practitioner_ID 
    , P.First_Name 
    , P.Last_Name 
    , gpi.Patient_First_Name 
    , gpi.Patient_Last_Name 
    , gpi.Patient_DOB 
    , gpi.Patient_Sex 
    , V.Carrier_ID 
    , V.Billing_Date 
    , V.Patient_Policy_ID 
    , V.Location_ID 
FROM Ntier_70751.PM.vwGenPatInfo gpi 
INNER JOIN Ntier_70751.PM.Vouchers V ON gpi.Account_ID = V.Account_ID 
INNER JOIN Ntier_70751.PM.Practitioners P ON V.Actual_Prov_Practitioner_ID = P.Practitioner_ID 
cross apply 
(
    select V2.Account_ID 
    from Ntier_70751.PM.Vouchers V2 
    where V2.Account_ID = V.Account_ID 

    group by V2.Account_ID 
    HAVING MAX(Location_ID) = 5 
     AND MIN(Location_ID) = 5 
) x 
+0

別の質問でそれを実行できますか?それは私の考えであった - 場所を5つだけ返すための別のクエリを実行するサブクエリですか? – MageeWorld

+0

@MageeWorldあなたが何を意味するか分からない。別のクエリでは、この状況で役立つとは思わない行の数が制限されます。 –

0

次のような条件を入れます。

WHERE "Vouchers"."Location_ID" = 5 
+1

これは、少なくとも5回訪問した人が戻ってくるので、OPは5人しか訪れなかった人がほしいと思っています。 –

0

だけではなく、 『バウチャー』。 『LOCATION_IDは』 =少なくとも一度ではなく、その場所を訪れたすべてのPatient_IDsを返す5'will条件」を使用して

SELECT "Vouchers"."Patient_ID", "vwGenPatInfo"."Patient_Number", 
     "Practitioners"."Practitioner_ID", "Practitioners"."First_Name", "Practitioners"."Last_Name", "vwGenPatInfo"."Patient_First_Name", "vwGenPatInfo"."Patient_Last_Name", "vwGenPatInfo"."Patient_DOB", "vwGenPatInfo"."Patient_Sex", "Vouchers"."Carrier_ID", "Vouchers"."Billing_Date", "Vouchers"."Patient_Policy_ID", "Vouchers"."Location_ID" 
FROM "Ntier_70751"."PM"."vwGenPatInfo" "vwGenPatInfo" INNER JOIN 
    "Ntier_70751"."PM"."Vouchers" "Vouchers" 
    ON "vwGenPatInfo"."Account_ID" = "Vouchers"."Account_ID" INNER JOIN 
     "Ntier_70751"."PM"."Practitioners" "Practitioners" 
    ON "Vouchers"."Actual_Prov_Practitioner_ID" = "Practitioners"."Practitioner_ID" 
WHERE "Vouchers"."Location_ID"=5 
    and not exists (select 1 
        FROM "Ntier_70751"."PM"."Vouchers" "Vouchers2" 
        WHERE "Vouchers2"."Patient_ID" = "Vouchers2"."Patient_ID" 
         AND "Vouchers2"."Location_ID"<>5) 
+0

これは望ましい結果を生成しますが、非対応です。サブクエリに<>があるため、すべての単一の行を評価する必要があります。 –

+0

@SeanLange - それは異なります。 location_id = 5の患者数が少ない場合は、サブクエリで評価される患者のみが(patient_idがインデックスされている場合)推測しています。とにかく、スキーマ仕様なしで知るのは難しいです。 – vercelli

+0

バウチャーの行数に依存します。 where句に<>があるときに何が起こっても、スキャンが行われます。 –

0

が存在すると、私は行くだろう排他的に。いくつかの方法がありますが、最もクリーンな方法は、max(location_id)< 5と最小(location_id)> 5

関連する問題