什么是默认的T-SQL JOIN行为,INNER或OUTER?

Mic*_*rie 22 sql t-sql sql-server

这个问题已经被要求用于MySQL,但对于Transact-SQL,默认JOIN行为是什么?

也就是说,简单地写JOIN一个与写作同义的查询INNER JOIN(就像MySQL的情况一样),或者其他什么东西,比如说也许FULL OUTER JOIN

Mic*_*rie 21

JOIN默认为INNER JOIN行为.

为了验证这一点,我运行了以下代码:

DECLARE @A TABLE (x INT)
INSERT INTO @A
    SELECT 1 UNION ALL
    SELECT 2

DECLARE @B TABLE (x INT)
INSERT INTO @B
    SELECT 2 UNION ALL
    SELECT 3

SELECT 
    A.x AS 'A.x', 
    B.x AS 'B.x'
FROM @A A
JOIN @B B
    ON A.x = B.x
Run Code Online (Sandbox Code Playgroud)

这只产生一行,与INNER JOIN行为一致:

A.x  | B.x
-----+-----
2    | 2
Run Code Online (Sandbox Code Playgroud)

与此对比FULL OUTER JOIN:

...

SELECT 
    A.x AS 'A.x', 
    B.x AS 'B.x'
FROM @A A
FULL OUTER JOIN @B B
    ON A.x = B.x
Run Code Online (Sandbox Code Playgroud)

这当然显示了所有三行:

A.x  | B.x
-----+-----
1    | NULL
2    | 2
NULL | 3
Run Code Online (Sandbox Code Playgroud)

  • 通常,"尝试它"不应该被用作结束特定行为的有效方法或"默认" - 有许多可以影响T-SQL行为的`SET`选项,例如,即使这样碰巧不是"JOIN"的情况.您的代码可以很好地说明行为,但不具有权威性.这就是为什么我觉得需要发布另一个答案,显而易见的是问题. (5认同)

Jer*_*ert 11

在T-SQL中,JOIN如果没有显式类型INNER JOIN,则由子句文档FROM(摘录)指定:

[ FROM { <table_source> } [ ,...n ] ]   
<table_source> ::=   
{  
    ...
    | <joined_table>
    ...   
}  

<joined_table> ::=   
{  
    <table_source> <join_type> <table_source> ON <search_condition>
    ...   
}  

<join_type> ::=   
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]  
    JOIN  
Run Code Online (Sandbox Code Playgroud)

指定返回所有匹配的行对.丢弃两个表中不匹配的行.如果未指定连接类型,则这是默认值.