【问题标题】:Inner join followed by a self join内部联接,然后是自联接
【发布时间】:2017-11-03 02:58:40
【问题描述】:

我有两张桌子PERSONPERSONRELATION

PERSONtable 上,我有PERSONpkFIRSTNAMELASTNAME 列。

PERSONRELATION 表上,我有MANAGER1fk,这是PERSONpk 的一个fk。

我正在尝试加入这两个表,将上面的所有字段带入并自行加入以添加MANAGERFIRSTNAMEMANAGERLASTNAME。这是我所做的,但显然不正确:

Select PERSONpk, MANAGER1FK,e.FIRSTNAME,e.LastName,m.FIRSTNAME,M.LASTNAME
FROM dbo.PERSON e
INNER JOIN dbo.PERSONRELATION rel
ON rel.PERSONFK = PERSONPK
INNER JOIN dbo.PERSON m ON e.PERSONpk = m.MANAGER1FK

【问题讨论】:

  • 您能展示一些示例数据和预期结果吗?
  • 在您第一次加入时,看起来您引用的是同一列,如果我理解您的架构,您可能应该使用 rel.MANAGER1FK = e.PERSONPK
  • 最后一个连接看起来有问题。人对人表在联接上不正确。它应该是 on m.personpk = rel.manager1fk rel 包含根据您在顶部的描述的员工和经理 ID。
  • 我认为您不需要多个表。您应该能够只使用 PERSON 表中的 Manager1 键来完成同样的事情,然后加入回自身。这是一个普通的父子类型查询。正如您所描述的,如果您选择 e.PersonPK 和 rel.Manager1fk,它将是相同的数字。你能提供一个数据模型或小提琴吗?

标签: sql sql-server inner-join self-join


【解决方案1】:

三个问题:

  • 您上次加入错误(当我相信您想将 rel.Manager1FK 加入到 m 时,您正在加入回 e。线性考虑...我有一个员工...一个员工可以有很多关系.. .每个关系都与另一个员工...根据列名,这些关系是员工经理关系。所以你从 P-->REL-->M M--P can't exist w/o REL in您的数据示例。
  • 您应该在第二次加入时使用 e.personpk 别名
  • 假设您必须引用 person 两次,因此 person 中的所有列都必须使用别名(即使在选择中)

表 personrelation 包含员工和经理对 person 的 FK;因此,您需要从 personrelation (MANAGER1fk) 中加入第二个 fk 字段(这不是自加入)如果层次结构都是亲自维护的,那将是自加入。

SELECT e.PERSONpk
     , rel.MANAGER1FK
     , e.FIRSTNAME
     , e.LastName
     , m.FIRSTNAME
     , M.LASTNAME
FROM dbo.PERSON e
INNER JOIN dbo.PERSONRELATION rel
  ON rel.PERSONFK = e.PERSONPK
INNER JOIN dbo.PERSON m 
  ON m.PERSONpk = rel.MANAGER1FK

【讨论】:

  • 使用 INNER JOIN 将消除没有老板的老板。您应该能够通过 INNER JOIN 然后 LEFT OUTER JOIN 抓住老板。
猜你喜欢
  • 2012-07-19
  • 2016-07-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多