【问题标题】:SQL Server - How to determine shared key between 2 tables?SQL Server - 如何确定 2 个表之间的共享键?
【发布时间】:2017-03-09 23:23:13
【问题描述】:

例如,如果我想链接 OPOR、ORDR 和 ODLN,但不知道它们之间的公共密钥是什么,我该如何找到呢?

例子:

SELECT o0.NumAtCard 'Customer PO' 
    , o0.DocNum 'Sales Order No'
    , o1.DocNum 'Purchase Order No'
    , o2.DocNum 'Delivery Order No'
    , o0.DocTotal 'Total Price'
FROM ORDR o0 
JOIN OPOR o1 ON o0.primarykey = o1.foreignkey -- left?
JOIN ODLN o2 ON o1.primarykey = o2.foreignkey -- inner?

如何确定“主键”和“外键”是什么?

OPOR的表结构:

ODLN 表结构:

【问题讨论】:

标签: sql-server crystal-reports


【解决方案1】:

如果您向下滚动 sp_help 结果,您应该会看到约束。如果有主键约束,看看它使用什么键。主键通常是用于链接到另一个表的主键。

【讨论】:

  • 你说得对,这里有主键约束。所有 3 个表都将 DocEntry 作为它们的主键。我尝试使用 ORDR 和 OPOR 进行内部连接,然后离开连接 ODLN 和 OPOR,但数据看起来错误。我没有正确使用连接吗?
  • 在不知道您的查询、预期结果和实际结果的情况下,这是不可能说的。它还涉及另一个问题。我要补充一下@QCDATA 所说的,通常您将一个表中的主键连接到第二个表中的另一列。在您的情况下,表格似乎完全相同,因此有点不寻常。
  • @Ilion - 这是有道理的。假设我想和 OPOR 一起加入 ORDR。我将使用 ORDR 的主键与 OPOR 的外键连接。如何在 OPOR 表中找到这个外键?
  • 我用一个例子扩展了我的其他答案。
【解决方案2】:

您需要知道这两个表的结构。在 SQL 服务器中:

sp_help TableA;
sp_help TableB;

在 MySQL 中:

describe TableA;
describe TableB;

这将显示表结构。如果数据库设计得好,你应该能够分辨出哪些列是外键。

根据您发布的结果知道要加入哪些列:

1) 你可能期待一些不存在的东西。 2)它可以取决于你想做什么。假设您想将 OPOR 中的行与 ODLN 匹配,在 ODLN 中它们被标记为已取消,您可以:

select * from OPOR 
inner join ODLN on 
OPOR.DocEntry=ODLN.DocEntry 
where CANCELLED='true';

或取消的任何有效值。但是,如果不知道您想要的查询或更多地了解这些列的含义,我真的无法给出建议。这些表似乎完全相同,这表明加入它们是不寻常的。

【讨论】:

  • 谢谢,我使用 exec sp_help 为我想加入的表提取数据结构。我刚刚用截图更新了我的帖子。如何判断哪些列是外键?
  • 感谢您的解释。因此,我正在尝试创建一个业务报告,将销售订单与采购订单以及交货单号联系起来。销售订单是我公司销售的商品。采购订单是我们从供应商处购买的商品。链接的目的是确认采购订单在提交 SO 后已发货(因此是交货单)。希望能澄清一点。
  • 您无权访问设计此数据库的人吗? (这是一个家庭作业问题吗?)我猜 DocNum 列是您要使用的列,因为它是唯一的其他整数列。例如。一个表中的 DocEntry = 另一个表中的 DocNum,但这是一个猜测。我希望如果使用外键正确设置此信息,则信息将显示在您看到主键信息的位置周围。
  • 我只是想知道数据库中某处是否有所有表关系的详细映射。一些发帖人建议我查看 Information_Schema?
猜你喜欢
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多