首页 > 解决方案 > 列值可能来自 3 个表中的 1 个(未标准化)

问题描述

我需要一个查询来填充报告。大多数数据将主要来自一个表 (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

日期 数量 收款人实例
2019 年 1 月 20 日 150.21 1ef55
2020 年 4 月 1 日 1175.00 A0z1l

user_payee_instance

收款人实例 收款人 ID
1ef55 1234
A0z1l 00a14468

userpayees

收款人 ID 收款人姓名
无效的 无效的

bank_payees

收款人 ID 收款人姓名
1234 沃尔玛

global_payees

内部收款人 ID 收款人姓名 行业代码 客户ID
00a14468 大通银行 9933 1000111

结果

日期 数量 收款人姓名 收款人 ID
2019 年 1 月 20 日 150.21 沃尔玛 1234
2020 年 4 月 1 日 1175.00 大通银行 00a14468

标签: sqlsql-servertsqlstored-procedures

解决方案


如果您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

推荐阅读