使用ON子句联接具有相同列名的表

时间:2019-04-04 22:41:33

标签: sql oracle

我正在学习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_Memberc_Group有一列具有相同名称Directory_ID。我期望的是c_Memberc_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%')
  1. 这是引用LIKE条件时引用具有相同名称的列上的两个表的较短方法吗?
  2. 如果是这样,那么这样的样式是否可以用于具有多个相同列名的表?

任何想法或评论将不胜感激。谢谢您的宝贵时间。

1 个答案:

答案 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 *