我正在学习SQL,并遇到以下查询。我想在连接表时询问“ ON”子句的条件:
SELECT c_User.ID
FROM c_User
WHERE EXISTS (
SELECT *
FROM c_Group
JOIN c_Member ON (c_Group.Group_Name LIKE 'mcp%')
WHERE
c_Group.Name = c_Member.Parent_Name
AND c_Member.Child_Name = c_User.Lower_User_Name
)
我知道表c_Member
和c_Group
有一列具有相同名称Directory_ID
。我期望的是c_Member
和c_Group
使用类似以下内容加入该列:
c_Group JOIN c_Member ON (c_Group.Directory_ID = c_Member.Directory_ID)
WHERE c_Group.Group_Name like 'mcp%'
有人可以解释这种情况如何匹配行吗?
c_Member ON (c_Group.Group_Name LIKE 'mcp%')
任何想法或评论将不胜感激。谢谢您的宝贵时间。
答案 0 :(得分:0)
这是您的相关子查询:
SELECT *
FROM c_Group
JOIN c_Member ON (c_Group.Group_Name LIKE 'mcp%')
WHERE
c_Group.Name = c_Member.Parent_Name
AND c_Member.Child_Name = c_User.Lower_User_Name
此子查询有效,但其拼写方式使其不清楚:
联接条件(c_Group.Group_Name LIKE 'mcp%'
)实际上与要联接的表(c_Member
)不相关;它实际上所做的是在表c_Group
上应用过滤器,从而使其进行过滤(在应用LIKE条件时,没有魔术,例如更短的方法来引用连接到具有相同名称的列的两个表) )。将其移至WHERE
子句会更有意义(这在功能上仍然等效)。
另一方面,WHERE
子句包含与要联接的表相关的条件(例如:c_Group.Name = c_Member.Parent_Name
)。更为明智的选择是将它们放在ON
的{{1}}子句中。
其他备注:
在使用JOIN
时,通常希望使用NOT EXISTS
而不是SELECT 1
,(大多数RDBMS会在幕后为您优化此操作,但这使意图更加清晰)
表别名可用于使查询更具可读性
我建议查询使用以下语法(在语法上与原始语法基本相同,但更加清晰):
SELECT *