介绍
在SQL中,联接是将记录集链接在一起的一种方式。
它们涉及限制在输出Recordset中返回哪些数据。 如果未指定连接,但指定了两个Recordset,则将生成没有指定限制的笛卡尔乘积。 从概念上讲,在可能指定的任何WHERE子句之前应用JOIN。
注意 Access(Jet)SQL不支持完全外部联接。
联接记录集时,它们通常在输出记录集中产生的记录多于输入记录集中产生的记录。 但是,并非总是如此。
JOINed Recordsets将两个输入Recordsets转换为单个输出Recordset,其中包含两个输入Recordsets的字段。
在Access(Jet)SQL中,表可以通过多种方式连接。
- 内部联接
最简单的形式可以是:
这将在输出Recordset中为一个Recordset中的每个记录与另一个Recordset中的每个记录的每种组合生成一条记录, 其中ON语句为TRUE 。 如果没有匹配的记录,则它将不包含在输出Recordset中。 如果不止一个,则所有组合将包含在输出Recordset中。FROM Table1 INNER JOIN Table2 ON Table1.Field=Table2.Field
请参阅下面的示例,以更好地理解这一点。
- 左联接; 右联接(外部联接)
最简单的形式可以是:
这会在输出Recordset中为一个Recordset中的每个记录与另一个Recordset中的每个记录的每种组合生成一条记录... 其中ON语句为TRUE ...或第二个(对于LEFT JOIN)或第一个(对于a RIGHT JOIN)记录不存在。 这会将输入Recordset中的一个设置为比另一个更高的优先级。 它包括一个记录集的所有记录,但仅包括匹配的另一个记录集的所有记录。 如果有多个匹配记录,则所有组合仍将包含在输出Recordset中。FROM Table1 LEFT JOIN Table2 ON Table1.Field=Table2.Field
请参阅下面的示例,以更好地理解这一点。
- 完全外部联接(Access(Jet)SQL不支持)
最简单的形式可以是:
这将在输出Recordset中为一个Recordset中的每个记录与另一个Recordset中的每个记录的每种组合生成一条记录... ,其中ON语句为TRUE ...或,否则第一个OR第二个匹配记录不存在。 这会将两个输入Recordsets设置为彼此相同的优先级。 它包括两个记录集的所有记录。 如果有多个匹配记录,则所有组合仍将包含在输出Recordset中。FROM Table1 OUTER JOIN Table2 ON Table1.Field=Table2.Field
请参阅下面的示例,以更好地理解这一点。
- 不加入(笛卡尔积)
请注意,这与其他格式不符。
在SQL中,只需列出两个用逗号(,)分隔的表即可。
处理未联接的链接的方式是,将两个输入Recordsets中所有记录的每个组合作为记录返回到输出Recordset中。 这可以从相对较小的输入记录集(笛卡尔乘积)产生大量记录。
请参阅下面的示例,以更好地理解这一点。
Table1 Table2
Name1 Value1 Name2 Value2
Andy 11 Andy 101
Andy 12 Andy 102
Bob 21 Charlie 301
Bob 22 Charlie 302
Don 41 Don 401
内部联接示例
SELECT Name1,Value1,Name2,Value2
FROM Table1 INNER JOIN Table2
ON Table1.Name1=table2.Name2
输出记录集
Name1 Value1 Name2 Value2
Andy 11 Andy 101
Andy 11 Andy 102
Andy 12 Andy 101
Andy 12 Andy 102
Don 41 Don 401
Bob和Charlie都根本没有使用此JOIN类型出现,因为两个表均未包含。
左外连接示例
SELECT Name1,Value1,Name2,Value2
FROM Table1 LEFT JOIN Table2
ON Table1.Name1=table2.Name2
输出记录集
Name1 Value1 Name2 Value2
Andy 11 Andy 101
Andy 11 Andy 102
Andy 12 Andy 101
Andy 12 Andy 102
Bob 21 Null Null
Bob 22 Null Null
Don 41 Don 401
包括Bob,但是由于没有来自Table2的匹配记录,因此来自Table2的字段保留为Null。
查理根本没有出现,因为它没有出现在表1中。
右外连接示例
SELECT Name1,Value1,Name2,Value2
FROM Table1 RIGHT JOIN Table2
ON Table1.Name1=table2.Name2
输出记录集
Name1 Value1 Name2 Value2
Andy 11 Andy 101
Andy 11 Andy 102
Andy 12 Andy 101
Andy 12 Andy 102
Null Null Charlie 301
Null Null Charlie 302
Don 41 Don 401
包括Charlie,但由于没有来自Table1的匹配记录,因此来自Table1的字段保留为Null。
Bob根本没有出现,因为它没有出现在Table2中。
全外连接示例
SELECT Name1,Value1,Name2,Value2
FROM Table1 OUTER JOIN Table2
ON Table1.Name1=table2.Name2
输出记录集
Name1 Value1 Name2 Value2
Andy 11 Andy 101
Andy 11 Andy 102
Andy 12 Andy 101
Andy 12 Andy 102
Bob 21 Null Null
Bob 22 Null Null
Null Null Charlie 301
Null Null Charlie 302
Don 41 Don 401
包括所有记录,如果两个输入记录集(EG。Andy)中有多个匹配项,则不止一次。
Bob和Charlie都包括在内,但是丢失的数据由Nulls表示。
没有任何地方没有代表的数据。
注意 Access(Jet)SQL不支持这种类型的联接。
不加入(笛卡尔积)示例SELECT Name1,Value1,Name2,Value2
FROM Table1,Table2
输出记录集
Name1 Value1 Name2 Value2
Andy 11 Andy 101
Andy 11 Andy 102
Andy 11 Charlie 301
Andy 11 Charlie 302
Andy 11 Don 401
Andy 12 Andy 101
Andy 12 Andy 102
Andy 12 Charlie 301
Andy 12 Charlie 302
Andy 12 Don 401
Bob 21 Andy 101
Bob 21 Andy 102
Bob 21 Charlie 301
Bob 21 Charlie 302
Bob 21 Don 401
Bob 22 Andy 101
Bob 22 Andy 102
Bob 22 Charlie 301
Bob 22 Charlie 302
Bob 22 Don 401
Don 41 Andy 101
Don 41 Andy 102
Don 41 Charlie 301
Don 41 Charlie 302
Don 41 Don 401
包括所有可能的组合。
From: https://bytes.com/topic/access/insights/608296-sql-joins