0

我有一个关于 JOINS 的快速问题。

如果我想从 table1 中查找 table2 中使用了多少项目,我会使用 INNER JOIN 还是 LEFT JOIN(见下文)。

INNER JOIN 会告诉我两个表中的“ID”在哪里,因此应该表示 table1 中的 ID 何时在 table2 中使用,但随后列出 ID 与 table1 ID 相同的所有 table2 ID(LEFT JOIN)应该带回相同的?

但结果不同:

INNER JOIN 带回 252,222 LEFT JOIN 带回 258,637

PS:table2 是 table1 的子项,因此 table2 ID 只能来自 table1(table1 是产品列表,table2 是所选产品列表)所以要查找 table1 中所有在 table2 中选择的产品(已选择)

SELECT DISTINCT 
t1.name, t1.details
FROM 
table1 AS t1
INNER JOIN 
table2 AS t2 ON t1.id = t2.t1_id


SELECT DISTINCT 
t1.name, t1.details
FROM 
table1 AS t1
LEFT JOIN 
table2 AS t2 ON t1.id = t2.t1_id

这将是正确的 SQL,我猜是 INNER JOIN。

4

3 回答 3

2

LEFT JOIN不一样INNER JOIN。使用 a LEFT JOIN,也会返回第二个表中不存在的那些行!如果您想要那些在第二个表中也有 ID 的记录,请使用INNER JOIN.

于 2012-10-19T14:34:49.310 回答
2

INNER JOIN 会告诉我两个表中的“ID”在哪里,因此应该表示 table1 中的 ID 何时在 table2 中使用,但随后列出 ID 与 table1 ID 相同的所有 table2 ID(LEFT JOIN)应该带回相同的?

在这种情况下,INNER JOIN 非常有意义,因为它会提供 table1 和 table2 共有的记录。

table2 是 table1 的子项,因此 table2 ID 只能来自 table1(table1 是产品列表,table2 是所选产品列表),因此从 table1 中查找所有在 table2 中选择的产品(已选中)

这要求您FOREIGN KEY在 TABLE2 中强制执行约束,即 ID 只能在它们出现在 TABLE1 中之后出现。一旦你这样做了,那就有意义了。

于 2012-10-19T14:36:05.923 回答
0

对于left join,如果结果不满足join则从table1和table2返回null的结果。在内部连接的情况下,将只返回满足条件的结果。

于 2012-10-19T14:49:33.280 回答