1

私は SQL Server 2008 を使用しており、2 番目のテーブルが 1 番目の子であり、3 番目と 4 番目のテーブルが 2 番目の両方の子であるというように、テーブルが関連している 4 つの異なるテーブルからデータを結合しようとしています。次のステートメントを使用しています。結果を出力しますが、9 つの異なるレコード (CR テーブルから 5 つ、CX テーブルから 4 つ) を取得するのではなく、3 番目と 4 番目のテーブルのデータが重複している 20 のレコードを取得しています。

テーブル CX への参照を省略すると、目的の 5 つの結果が得られ、CR への参照を省略すると、目的の 4 つの結果が得られます。スクリーンショットを投稿しますが、評判が悪いため投稿できません。

SELECT
        LS.SITECODE,
        ep.EP_KEY,
        C0.LEASEID,
        C0.SDATE AS LeaseStart,
        C0.EDATE AS LeaseExpiry, 
        CR.EFFDATE AS RenewalDate,
        CX.SDATE AS ReviewDate     
    FROM LS
    INNER JOIN FMEP AS ep ON LS.SITECODE = ep.SITECODE
    INNER JOIN C0 ON ep.EP_KEY = C0.EP_KEY
    INNER JOIN CR ON C0.LEASEID = CR.LEASEID
    INNER JOIN CX ON C0.LEASEID = CX.LEASEID                                           
    WHERE ls.SITECODE = 2121

解決策を求めて過去数時間検索しましたが、SQL に精通していないため、正しい検索用語を使用していないことは明らかです。私は SQL に慣れていないので、あなたの回答を理解するのに苦労している場合は、しばらくお待ちください。時間を割いてこれを確認していただきありがとうございます。

4

1 に答える 1

0

私があなたを正しく理解していれば、C0をCRに結合し、次にc0をCXに結合する必要があります(したがって、5行と4行が得られます)

ただし、一方の結合から 5 行、もう一方の結合から 4 行を取得します。DBMS は、これら 2 つの結合を接続し、小さな相互結合 (4 行ごとに他の 5 行) を作成する方法を認識していないため、20 行になります (説明が正しい方法で理解されている場合)。

これは、必要な9行を取得するソリューションです。

SELECT
        LS.SITECODE,
        ep.EP_KEY,
        C0.LEASEID,
        C0.SDATE AS LeaseStart,
        C0.EDATE AS LeaseExpiry, 
        CR.EFFDATE AS RenewalDate,
        'CR'
    FROM LS
    INNER JOIN FMEP AS ep ON LS.SITECODE = ep.SITECODE
    INNER JOIN C0 ON ep.EP_KEY = C0.EP_KEY
    INNER JOIN CR ON C0.LEASEID = CR.LEASEID
    WHERE ls.SITECODE = 2121
UNION
SELECT
        LS.SITECODE,
        ep.EP_KEY,
        C0.LEASEID,
        C0.SDATE,
        C0.EDATE, 
        CX.SDATE   
        'CX'  
    FROM LS
    INNER JOIN FMEP AS ep ON LS.SITECODE = ep.SITECODE
    INNER JOIN C0 ON ep.EP_KEY = C0.EP_KEY
    INNER JOIN CX ON C0.LEASEID = CX.LEASEID     
    WHERE ls.SITECODE = 2121

ただし、C0 行が 1 回だけ必要な場合は (CX または CR を使用すると、より適切な結合を行う必要があります)。

于 2013-05-06T08:18:14.747 に答える