此联接类型是什么:JOIN [状态] ON [名称] ='已确认'

时间:2018-12-09 15:17:09

标签: sql sql-server

我遇到了在this问题中从未见过的联接样式:

UPDATE SomeTable
SET CurrentStatusID = [Status].[ID]
FROM SomeTable
 RIGHT JOIN [Status] ON [Name] = 'Acknowledged'
WHERE SomeTable.[ID] = @SomeID

有人可以解释吗?这似乎是通常加入的捷径。换句话说:

Select * from Items
JOIN ItemTypes on Code = 'TASK'

是以下操作的快捷方式:

Select * from Items i
JOIN ItemTypes it on i.ItemTypeId = it.Id
where it.Code = 'TASK'

对吗?还是我错过了什么?

1 个答案:

答案 0 :(得分:2)

不正确,它不是快捷方式,至少不是您认为的快捷方式(准确地说:这样写的yum downgrade ghostscript-9.07-31.el7可能被视为INNER JOIN + CROSS JOIN的快捷方式在这里,但我建议您避免认为是这样)。

实际上,在任何类型的WHERE中,实际上都允许您使用常量,而不仅限于列,对于JOIN,常量也取决于您在哪里编写东西。

请考虑以下两个示例:

OUTER JOIN

WITH TableA(ID) AS (
    SELECT 1
    UNION
    SELECT 2
), TableB(ID, Type) AS (
    SELECT 1, 'Type1'
    UNION
    SELECT 1, 'Type2'
    UNION
    SELECT 2, 'Type2'
)
SELECT *
FROM TableA
LEFT OUTER JOIN TableB ON TableA.ID = TableB.ID
WHERE Type= 'Type1'

第一个示例说:连接所有内容,但仅返回包含Type1的记录。
第二个示例说:仅在右侧拥有Type1时才加入,即使没有加入(WITH TableA(ID) AS ( SELECT 1 UNION SELECT 2 ), TableB(ID, Type) AS ( SELECT 1, 'Type1' UNION SELECT 1, 'Type2' UNION SELECT 2, 'Type2' ) SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.ID = TableB.ID AND Type= 'Type1' )也会返回所有内容