【问题标题】:Can you join two select statements when the composite primary keys are not in both statements当复合主键不在两个语句中时,您可以加入两个选择语句吗
【发布时间】:2020-02-08 20:54:33
【问题描述】:

我需要一些建议。

我在连接两个表时遇到问题。

示例:所有者有一个五段式复合密钥
位置有一个六片组合键

所有者表有
As_Of_Date(Key), PORT_CD(Key), Deal_Or_Schedule(Key), Deal_Sched_No(Key),owner_port_cd(Key),Percent

位置表有 As_Of_Date (Key),PORT_CD (Key),Deal_Or_Schedule (Key), Deal_Sched_No (Key), Book_CD_Nme (Key),Positn_Num (Key)

您可以在 Owner 中看到 4 个条件匹配加入表 2,但 Onwer_port_cd 无法加入,因为它不在 Position 中。

我需要从两张表中获取一张表,以便将收入映射到其所有者。

现在我的加入结果是笛卡尔积,因为它没有包含所有限定符。

【问题讨论】:

  • 这个不是很清楚。什么在杀死你?为什么不能加入 OWNERSHIP 和 POSITION_ALLOCATION 表?
  • 感谢编辑。但这仍然不清楚且难以阅读。请阅读代码和引用的编辑帮助重新内联和块格式。也重新换行。请在发帖之前查看编辑框下方帖子的格式化版本。不,我看不到。 “4 个条件匹配”是什么意思?还是“Onwer_port_cd 不在位置,无法加入”?您的帖子正文中仍然没有问题,也没有minimal reproducible example。您是否打算在这篇文章中添加一些代码? PS One 不需要知道查询的约束。表格的含义(一行所说的)是必要且充分的。
  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL 的 SQL,其中包括约束、索引和表格初始化。 How to Ask
  • 当你得到一个你不期望的结果时,停止试图找到你的总体目标并找出你的误解是什么。--隔离第一个意外的子表达式及其输入和输出。 (调试基础。)询问一下。没有人可以接受您所写的内容并知道您的查询应该做什么或为什么您认为它会这样做。使用足够的单词、句子和对部分示例的引用。在给出业务关系(船舶)/关联或表(基础或查询结果)时,说明其中的一行根据其列值说明了业务情况。谷歌在 cmets 中重新@。

标签: sql sql-server select inner-join composite-primary-key


【解决方案1】:

试试这个:

SELECT *
FROM JUNE_INCOME JI
JOIN CHART_OF_ACCOUNTS CA
ON JUNE_INCOME.GL_ACCT_NO = CHART_OF_ACCOUNTS.GL_ACCT_NO
JOIN SECURITY_MASTER SM
ON JUNE_INCOME.INS_NO = SECURITY_MASTER.INS_NO
JOIN POSITION_ALLOCATION PA
ON JUNE_INCOME.TRADE_DT = POSITION_ALLOCATION.AS_OF_DATE
AND JUNE_INCOME.PORT_CD = POSITION_ALLOCATION.PORT_CD
AND JUNE_INCOME.BOOK_CD_NME = POSITION_ALLOCATION.BOOK_CD_NME
AND JUNE_INCOME.POSITN_NUM = POSITION_ALLOCATION.POSITN_NUM
JOIN POSITIONS PO
ON JUNE_INCOME.PORT_CD = POSITIONS.PORT_CD
AND JUNE_INCOME.BOOK_CD_NME = POSITIONS.BOOK_CD_NME
AND JUNE_INCOME.POSITN_NUM = POSITIONS.POSITN_NUM
JOIN OWNERSHIP OW
ON PA.AS_OF_DATE=OW.AS_OF_DATE
AND PA.PORT_CD=OW.PORT_CD
AND PA.DEAL_OR_SCHEDULE=OW.DEAL_OR_SCHEDULE
AND PA.DEAL_SCHED_NO=OW.DEAL_SCHED_NO
JOIN OWNERS 
ON OWNERSHIP.OWNER_PORT_CD = OWNERS.OWNER_PORT_CD

请确保在您的问题中添加输入和预期输出。 此外,使用别名避免每次都写全名。

【讨论】:

  • 不幸的是,这与我得到的结果相同,应该是 309 行,返回 1476,因为它没有来自任一表的完整复合键。感谢您的想法,我在布置事情方面很糟糕。问题是所有权有一个由五部分组成的主键,其中列 OWNER_Port_CD 不在 position_allocation 中。 OWNERSHIP 也缺少 Book_CD_NME,它是 5 部分主键的一部分。
猜你喜欢
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 2017-12-03
  • 1970-01-01
相关资源
最近更新 更多