【问题标题】:Column value could come from 1 of 3 tables (not normalized)列值可能来自 3 个表中的 1 个(未标准化)
【发布时间】:2021-06-22 13:21:15
【问题描述】:

我需要一个查询来填充报告。大多数数据将主要来自一个表 (payment_history),但其中一列 (Payee Name) 将来自三个表之一(它们几乎相同,第三个表有更多列并且键列的名称不同)。我唯一尝试过的是左外连接,但所做的只是添加更多列。我需要一列由三个不同的表填充

示例(在此示例中,值在 bank_payees 表中:

select payment_history.Date, payment_history.Amount, payees_table_query.PayeeName, payees_table_query.PayeeId
from payment_history

payment_history

Date Amount PayeeeInstance
1/20/2019 150.21 1ef55
4/1/2020 1175.00 A0z1l

user_payee_instance

PayeeInstance PayeeId
1ef55 1234
A0z1l 00a14468

用户收款人

PayeeId PayeeName
null null

bank_payees

PayeeId PayeeName
1234 Walmart

表格global_payees

InternalPayeeId PayeeName IndustryCode CustomerId
00a14468 Chase Bank 9933 1000111

结果

Date Amount PayeeName PayeeId
1/20/2019 150.21 Walmart 1234
4/1/2020 1175.00 Chase Bank 00a14468

【问题讨论】:

标签: sql sql-server tsql stored-procedures


【解决方案1】:

如果您UNION ALL 三个收款人表,您可以将它们视为一个表(它们可能应该放在首位)

然后它只是将表连接在一起。

SELECT
  *
FROM
  payment_history
LEFT JOIN
  user_payee_instance
    ON user_payee_instance.PayeeInstance = payment_history.PayeeInstance
LEFT JOIN
(
  SELECT PayeeId, PayeeName FROM userpayees
  UNION ALL
  SELECT PayeeId, PayeeName FROM bank_payees
  UNION ALL
  SELECT InternalPayeeId, PayeeName FROM global_payees
)
  AS payees
    ON payees.PayeeId = user_payee_instance.PayeeId

【讨论】:

  • 第三个表的列数不同,键列名不同。我收到错误消息“使用 UNION、INTERSECT 或 EXCEPT 运算符组合的所有查询必须在其目标列表中具有相同数量的表达式”
  • @Aaron 但这不是真的,在你的问题中,所有 3 个表都有 2 列,一个 int 和一个 varchar
  • @Aaron - 我们只能解决您的问题,所以请解决...问题!
  • @GuidoG 对。我看到了混乱。我确实在顶部说过所有 3 个几乎相同。这些都是例子。第三个表 global_payee 有更多的列,并且键列的名称不同。我会更新原来的问题
  • @MatBailie 我更新了原来的问题
猜你喜欢
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 2016-11-12
  • 2017-04-08
  • 2018-01-21
相关资源
最近更新 更多