2017-10-07 50 views
0

这是否意味着这种加入工作就像一对一的关系?通过引用完整性连接表?

免得考虑下表:

Table 1 Table 2 
________ ________ 
id name id name 
1 O  1 T 
2 B  1 N 

SELECT Table 1.name, Table 2.name FROM Table 1, Table 2 WHERE Table 1.id = Table 2.id 

会回到这只是最后的行1 N为参加行?

1 O => 1N 

它是如何工作的,如果第二个表具有相同的键id。这是否需要以前的最后一次同意?

+0

它会给你1 O => 1T和1 O => 1N。将它作为{(1,0)}和{(1,T),(1,N)}之间的笛卡尔积处理} –

+1

[踢坏的恶习:使用旧式JOIN](http://sqlblog.com/blogs /aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) –

回答

0

name1, name2 
O , T 
O , N 

您可以在下面的SO问题找到各种连接类型更宽泛的描述从不FROM条款中使用逗号。 总是使用正确的,明确的JOIN语法。您的查询应写为:

SELECT t1.name, t2.name 
FROM Table1 t1 JOIN 
    Table2 t2 
    ON t1.id = t2.id; 

JOIN返回所有匹配的行。没有“第一”或“最后”行的SQL概念。 SQL表格代表无序集合。

这很容易检查。 Here是演示结果的SQL小提琴。

0

只是一个关于“约定”,可能会帮助你更好地了解“ID”的说明。

“id”(,通用约定)是一个自动编号的整数,可用于唯一地定位该表中的特定行。

每个表格(按照常规约定)都会有自己的“id”列,但这并不意味着您总是通过这些列加入。

表2很可能包含一个“外键”,使一个连接到Table

一个“外键”栏(通过共同约定)的命名往往是“表名” &的组合下划线&“id”。因此,一个可能的修订,以你的例子是这样的:

Table1  Table2 
________ ________________________ 
id name id table1_id name 
1 O  1000   1 T 
2 B  9678   1 N 

注意从表1的ID是如何在这个例子中,以表2的ID没有关系,所以查询现在是:

SELECT t1.name, t2.name 
FROM Table1 t1 
INNER JOIN Table2 t2 ON t1.id = t2.table1_id; 

加盟坚持指定的逻辑,这里是t1.id must equal t2.table1_id。在逻辑中没有“最后”的“第一个”。任何符合指定条件的行都会加入。(注:&这可能意味着没有行获得加入视情况而定)


从字后不使用表名之间的逗号。习惯于诸如INNER JOIN,LEFT OUTER JOIN(或它们的缩写JOIN和LEFT JOIN)这样的术语,这只是在长期的中好得多。