2017-06-08 7 views
0

左テーブルにあるレコードと同じ量のレコードを返すSQLステートメントの記述方法を調べる際に問題があります。右側の表からデータを取得する唯一の方法は、3番目の表を使用することです。右テーブルがリンクテーブルを介して接続されている場合、すべての左テーブルレコードを返す結合

たとえば、3つのテーブル、[サイト]、[アドレス]、および[所属]があります。多くのアフィリエイトは、サイト(連絡先、郵送先住所、オーナー、および公式)に対してアクティブになることができますが、所属に関連付けられている人や住所がない場合があります。 IE。サイトには連絡担当者がいるかもしれませんが、公式に指定されていない場合や、サイトにまだ郵送先住所が割り当てられていない場合があります。 サイト(左側の表)とアフィリエーションは共通のIDでリンクされています。 Sites.ID = Affiliations.Site_ID

提携企業とアドレス(右表)は、共通のアドレスレコードIDによってリンクされている Affiliations.Address_RID = Addresses.RID

私が持っているクエリは

SELECT A.ID, 
    A.NAME, 
    C.ADDR_1, 
    C.CITY_NAME, 
    C.STATE_CODE, 
    C.POSTAL_CODE 
FROM SITES A, 
    AFFILIATIONS B, 
    ADDRESSES C 
WHERE A.ID = B.SITE_ID 
    AND B.ADDRESS_RID = C.RID 
    AND B.AFFILIATION_TYPE = 'MAILING ADDRESS' 
ORDER BY A.ID 
です

私がサイトテーブルだけを照会した場合の結果は1580個のサイトレコードです。上記のメールアドレスのクエリを実行すると、私は1386のレコードを取得します。私は、郵送先住所がないレコードについては、すべての1580レコードをnullで返す必要があります。 私は何か間違っていますが、私はそれを見ていません。

コメント?あなたは試してみてください

おかげ

+0

ロジックを2つまたは3つの別々のクエリに分割し、一時テーブルを使用してそれらを結合し、SQLでロジックをはっきりと見ることができるときは、すべてのサブクエリを組み合わせることができます。ちなみに、あなたは現在テーブルに加わっていますが、あなたが参加しているものが明確ではありません。 joinキーワードを使用し、where節に参加しないでください –

+0

サブクエリを使用することが目的のルートになるかどうか疑問に思いました。この例では、実際にフィルタに使用するテーブルが3つあります。 2つの結合テーブル(1580レコード)の条件を満たすサイトのクエリは1になります。 1521の連絡先につながったサイトに基づいて連絡先情報を検索する。 1386レコードを返す郵送用アドレスの場合は1です。 –

答えて

0

は、左側に参加し、それが動作しませんならば、どこ条件を削除します。

SELECT A.ID, 
    A.NAME, 
    C.ADDR_1, 
    C.CITY_NAME, 
    C.STATE_CODE, 
    C.POSTAL_CODE 
FROM SITES A, 
left join AFFILIATIONS B on A.ID = B.SITE_ID 
left join ADDRESSES C on B.ADDRESS_RID = C.RID 
    WHERE 
    B.AFFILIATION_TYPE = 'MAILING ADDRESS' 
ORDER BY A.ID 
+0

アフィリエーションBへの左結合は、where節のBに述語を適用するため、無意味です。 –

0

外側のための「古い」Oracle構文が参加し、このようなものです: -

SELECT A.ID, 
    A.NAME, 
    C.ADDR_1, 
    C.CITY_NAME, 
    C.STATE_CODE, 
    C.POSTAL_CODE 
FROM SITES A, 
    AFFILIATIONS B, 
    ADDRESSES C 
WHERE A.ID = B.SITE_ID (+) 
    AND B.ADDRESS_RID = C.RID (+) 
    AND B.AFFILIATION_TYPE (+) = 'MAILING ADDRESS' 
ORDER BY A.ID 

しかし、あなたが本当にANSI構文を使用する必要があります - 参加条件であるかを確認する方がはるかに簡単ですし、フィルタとは何ですか: -

SELECT A.ID, 
    A.NAME, 
    C.ADDR_1, 
    C.CITY_NAME, 
    C.STATE_CODE, 
    C.POSTAL_CODE 
FROM SITES A 
LEFT JOIN AFFILIATIONS B ON A.ID = B.SITE_ID AND B.AFFILIATION_TYPE = 'MAILING ADDRESS' 
LEFT JOIN ADDRESSES C ON B.ADDRESS_RID = C.RID 
ORDER BY A.ID 

注意:Joinの条件は、join句に入れる必要があります。 where句に含めると、 'MAILING ADDRESS'所属タイプのない行は返されません。

+0

ありがとう!私はそれが私が学んだことだったので、私はまだ古いオラクル構文を使用していました。私はANSI構文を使用していないので、かなりの時間(資金調達の状態の欠如)でアップグレードしていません。私が参加しているものを見るのはずっと簡単です。 –

関連する問題