【问题标题】:SQL INNER JOIN duplicating data on output?SQL INNER JOIN 在输出上复制数据?
【发布时间】:2013-05-06 06:59:50
【问题描述】:

我正在使用 SQL Server 2008 并尝试连接来自 4 个不同表的数据,这些表是相关的,因此第 2 个表是第 1 个表的子表,第 3 和第 4 个表是第 2 个表的两个子表,我正在使用下面的语句输出结果,但不是得到 9 条不同的记录(5 条来自 CR 表,4 条来自 CX 表),我得到了 20 条记录,其中来自第 3 和第 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 新手,所以如果我难以理解您的回答,请耐心等待,并提前感谢您抽出宝贵时间查看此内容。

【问题讨论】:

  • 示例数据,预期输出......
  • 您可以使用SQL Fiddle添加一些数据样本和表模式。
  • 根据您对省略连接的描述,给定 CR 有 5 个leaseid 值,CX 有 4 个leaseid 值;而且它们是内部连接的,我不明白您为什么期望结果中有 9 行?

标签: sql sql-server inner-join


【解决方案1】:

如果我没听错的话,你希望 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 你必须做一个更好的连接)

【讨论】:

    猜你喜欢
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 2021-02-04
    • 2018-03-09
    • 2013-07-01
    • 1970-01-01
    相关资源
    最近更新 更多