【问题标题】:OUTER JOIN on 3 tables with a condition only present in the outer two3 个表上的 OUTER JOIN,条件仅存在于外部两个表中
【发布时间】:2018-08-09 22:22:30
【问题描述】:

我的输出需要是:

company, account, t1.status, t2.amount, t3.amount, 

MS SQL 服务器

t1 拥有所有账户,但没有公司 t2 和 t3 各有 company 字段。 t2 和 t3 eahc 有金额,有些账户出现在两个表中,而有些只出现在一个或另一个中

见下表结构:

这是示例数据和表结构的SQL Fiddle

【问题讨论】:

  • Table1 与表 2 和表 3 有何关系?帐户似乎不是特定于公司的...例如,帐户 10006 的状态为 A;是给 10 号公司的吗? 20?两个都? (您拥有两家公司的帐户;一个在表 2 中,另一个在表 3 中)
  • 嗨。您给出了输出和输入列,但没有说明输出内容应该是输入内容的函数,或者说输出和输入表的含义是什么。你的数据是输入还是输出?请阅读minimal reproducible example 并采取行动。还点击谷歌搜索'stackexchange homework' - 显示您尝试过的内容。 PS请use text, not images/links, for text (including code, tables & ERDs)。使用图像仅是为了方便补充文本和/或无法在文本中给出的内容。永远不要给出没有图例/键的图表。
  • @JoshPart 您将图像文本化会有所帮助。 (虽然评论让海报这样做可能是对未来更好的投资。)但是问题应该是独立的,帖子中的文字可以表达的内容应该是——包括你小提琴中的文字。您的修改不应获得批准。

标签: sql-server outer-join


【解决方案1】:

如果我理解正确,您首先需要在 t2 和 t3 之间有一个 FULL OUTER JOIN 以从两个表中获取数据,然后 JOIN 与 t1 一起获取数据。

select tx.COMPANY, t1.ACCOUNT, t1.STATUS, tx.AMT2, tx.AMT3
from t1
inner join (select ISNULL(t2.COMPANY, t3.COMPANY) COMPANY,
                   ISNULL(t2.ACCOUNT, t3.ACCOUNT) ACCOUNT,
                   t2.AMT AMT2, t3.AMT AMT3
            from t2
            full outer join t3
            on t2.COMPANY = t3.COMPANY and t2.ACCOUNT = t3.ACCOUNT) tx
on t1.ACCOUNT = tx.ACCOUNT

这是使用您的样本数据获得的结果(在您的样本数据中,仅账户 10005 股公司在 t2 和 t3 之间)

COMPANY ACCOUNT STATUS  AMT2    AMT3
10      10000   I       50      NULL
10      10001   I       34      NULL
20      10002   I       230     NULL
20      10003   A       402     NULL
10      10004   I       120     NULL
10      10005   I       3       377
20      10006   A       4       NULL
10      10006   A       NULL    27
10      10007   A       33      NULL
20      10007   A       NULL    3828
20      10008   A       NULL    377
10      10009   I       NULL    77
10      10010   I       NULL    8818
20      10011   A       NULL    12
10      10012   A       NULL    33
20      10013   I       NULL    11

【讨论】:

    【解决方案2】:

    你试过JOIN吗?

    Select t2.company, t3.company, t1.account, t1.status, t2.amount, t3.amount,
    from [Table1] as t1
    left join [Table2] as t2 on t1.account = t2.account
    left join [Table3] as t3 on t1.account = t3.account
    

    如果您想表明该帐户在 t2 和 t3 中不存在,您可以将 company 再包装成一个 isnull

    【讨论】:

    • 是的,但是当两个表中都存在帐户时,我需要 t2.company = t3.company。如何设置最后一个条件?
    • 你的意思是t2和t3中的单个AccountID公司可以不同?并且只显示相同的地方?
    • 我的意思是,如果他们都是公司 10,则显示公司 10 的 t1.amount 和 t2.amount。
    • 当 t1.company 为 10 且 t2.company 为 20 时显示两行?
    • 如果公司/帐户在两个表中都存在,则显示 1 行。另一种说法是公司/帐户是 t2 和 t3 的主要索引。
    猜你喜欢
    • 2019-01-27
    • 2014-07-19
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多