sql – 多个左连接在一个查询中的多个表

前端之家收集整理的这篇文章主要介绍了sql – 多个左连接在一个查询中的多个表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个主表,其中存储有多个级别的项目,父母和子项,并且还有一个第二个表可能有也可能没有其他数据.我需要从我的主表中查询两个级别,并在第二个表中添加一个左侧的连接,但是由于我的查询中的排序将不起作用.
SELECT something FROM master as parent,master as child
  LEFT JOIN second as parentdata ON parent.secondary_id = parentdata.id
  LEFT JOIN second as childdata ON child.secondary_id = childdata.id
WHERE parent.id = child.parent_id AND parent.parent_id = 'rootID'

左连接只适用于from子句中的最后一个表,所以我只能使其在左连接之一工作.在上面的例子中,左连接不会工作,因为第一个左连接指向from子句中的第一个表,第二个连接将永远不会这样工作.

我该怎么做这个工作?

解决方法

这种查询应该工作 – 在用现代ANSI JOIN语法重写之后:
SELECT something
FROM   master      parent
JOIN   master      child ON child.parent_id = parent.id
LEFT   JOIN second parentdata ON parentdata.id = parent.secondary_id
LEFT   JOIN second childdata ON childdata.id = child.secondary_id
WHERE  parent.parent_id = 'rootID'

这里的跳线是明确的JOIN在“旧样式”CROSS JOIN之前用逗号(,)绑定. I quote the manual here:

In any case JOIN binds more tightly than the commas separating
FROM-list items.

重写第一个后,所有连接都将从左到右应用,它可以正常工作.

只是为了说明这一点,这也可以起作用:

SELECT something
FROM   master parent
LEFT   JOIN second parentdata ON parentdata.id = parent.secondary_id,master child
LEFT   JOIN second childdata ON childdata.id = child.secondary_id
WHERE  child.parent_id = parent.id
AND    parent.parent_id = 'rootID'

但是,通常优选显式的JOIN语法,如您的例子所示.

猜你在找的MsSQL相关文章