可能重复:
SQL left join vs multiple tables on FROM line?
SELECT messages.message_title,
messages.message_content,
messages.message_timestamp,
user_message_relations.sender_id
FROM messages
LEFT JOIN global_messages ON messages.message_id = global_messages.message_id
LEFT JOIN user_messages ON messages.message_id = user_messages.message_id, user_message_relations
WHERE user_message_relations.receiver_id = 3或
SELECT messages.message_title,
messages.message_content,
messages.message_timestamp,
user_message_relations.sender_id
FROM messages,
global_messages,
user_messages,
user_message_relations
WHERE user_message_relations.receiver_id = 3我的主要问题是,如果我可以像第二个查询那样直接调用表,那么使用LEFT OUTER JOIN (或任何类型的JOIN)有什么意义?有福利吗?
我认为第二种方法不被认为是“最佳实践”.考虑到这一点,如果我想用id为3填充用户的收件箱,下面的查询是否正确?
SELECT messages.message_id,
messages.message_title,
messages.message_content,
messages.message_timestamp,
user_messages.message_id,
user_message_relations.sender_id
FROM user_message_relations
INNER JOIN user_messages ON user_message_relations.user_message_id = user_messages.user_message_id
INNER JOIN messages ON user_messages.message_id = messages.message_id
WHERE user_message_relations.receiver_id = 3发布于 2011-05-28 03:21:06
就像OMG小马说的那样,没有所谓的“直接调用表”的东西。在SQL中,可以通过三种方式组合多个表:
)中的行都匹配。
碰巧,您的三个示例都有其中一个,按我列出的顺序排列。没有一个比另一个更“有效率”,他们返回的结果非常不同!
之所以会出现混淆,是因为它们有两种不同的语法;您的示例2使用了旧的SQL89语法,其中的表名用逗号分隔,除非WHERE子句中的某些内容表示要加入它们,否则组合是笛卡尔产品。
发布于 2011-05-28 02:30:00
即使右边的表中没有匹配的元素,左侧的外部联接也会为您提供来自左侧表中的所有元素。逗号运算符是一个内部联接别名,它指示您只需要在某些字段上匹配的元素(从您正在发布的查询中,您在表之间没有限制因素,那么您将得到表的笛卡儿积)。
此查询只获得元组,其中字段在Table1和Table2中是相同的。
Table1 LEFT OUTER JOIN Table2 ON(Table1.field = Table2.field)此查询将以笛卡尔乘积形式获取所有可能的元组。
Table1, Table2https://stackoverflow.com/questions/6159296
复制相似问题