在非键列上自联接

时间:2016-07-26 07:26:10

标签: sql-server tsql join self-join

JOIN表格自身ON一个不具有唯一值的列是否存在分析结果?

我见过的大多数自我加入查询都是在PK列上完成的。我遇到问题让我的数字正确,所以我想知道我做的是否有意义。

E.g。

SELECT * 
FROM Employee a
JOIN Employee b
ON a.Birthdate = b.Birthdate

2 个答案:

答案 0 :(得分:1)

当您的查询现在被写入时,它将返回所有员工对:

  1. 具有相同出生日期的不同员工记录
  2. 所有员工记录将自行返回
  3. 我认为这没有多大意义。您能否提供有关您希望实现的内容以及Employee表结构的更多信息?

    如果Birthdate可以为空,那么您还必须修改ON子句以加入NULL值,例如:

    SELECT * 
    FROM Employee a
    JOIN Employee b
    ON COALESCE(a.Birthdate,'19000101') = COALESCE(b.Birthdate,'19000101')
    

答案 1 :(得分:0)

SQL INNER JOIN,CROSS JOIN&隐式JOIN(逗号)都导致我们可以将左参数行和右参数行(每个源表别名重命名的列)的每个可能串联称为SQL“交叉产品”。在INNER JOIN的情况下,ON然后删除所有不满足其条件的结果行。 (因此INNER JOIN ON 1 = 1与CROSS和隐式JOIN相同。这也是允许INNER JOIN而不是ON的方言的结果。)无论表中有什么NULL,这都是如此。

this (dialect-independent) answer explaining INNER/CROSS/implicit JOINs。这也解释了每个 JOIN“有意义”。 (尽管非关系型SQL表(具有NULLS或重复行的表)的SQL含义复杂且模糊不清。)当然,使用错误的查询并不“有意义”。

PS您可能只想要SELECT UNIQUE行。您可能不希望行WHERE a.employee = a.employee。并且你可能不希望,对于列(a.employee,...,b.employee,...),行(x,...,y,...)和行(y,... 。,x,...),通常的解决方案就像WHERE a. employee <= b.employee。但是,在编写适当的查询之前,您需要知道输入表和结果表的含义。