SQL INNER JOIN在输出上复制数据?

时间:2013-05-06 06:59:50

标签: sql sql-server inner-join

我正在使用SQL Server 2008并尝试从表中相关的4个不同表中连接数据,以便第2个表是第1个和第3个表的子表。第4个表是第2个孩子,我使用以下语句输出结果,而不是获得9个不同的记录(5个来自CR表,4个来自CX表)我得到20个记录,其中数据来自3rd& ;第4个表格是重复的。

如果我省略对表CX的引用,我得到了所需的5个结果,省略了对CR的引用,得到了所需的4个结果,但是我需要返回两个表的9个结果而不是我得到的20个记录。我会发布截图,但由于声誉不好而无法使用。

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的新手,所以如果我很难理解你的回答,请耐心等待,并提前感谢您抽出时间来研究这个问题。

1 个答案:

答案 0 :(得分:0)

如果我理解你的话,你希望C0加入CR 然后c0与CX连接(所以你得到5和4行)

但是你从一个连接获得5行,而从另一个连接获得4行。 DBMS不知道如何连接这两个连接并进行一点交叉连接(每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一次,(通过一个CX或一个CR你必须做一个更好的连接)