【问题标题】:Using ON clause to JOIN tables with same column name使用 ON 子句连接具有相同列名的表
【发布时间】:2019-04-04 22:41:33
【问题描述】:

我正在学习 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. 如果是这样,那么这种样式是否适用于具有多个相同列名的表?

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

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    这是您的相关子查询:

    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 条件时引用连接在同名列上的两个表的更短的方法 em>)。将其移至 WHERE 子句会更有意义(这在功能上仍然是等效的)。

    • 另一方面,WHERE 子句包含与正在连接的表相关的条件(例如:c_Group.Name = c_Member.Parent_Name)。更明智的选择是将它们放在JOINON 子句中。

    其他说明:

    • 当使用NOT EXISTS 时,您通常更喜欢SELECT 1 而不是SELECT *,(大多数RDBMS 会在后台为您优化,但这会使意图更清晰)。

    • 表别名可用于使查询更具可读性

    我建议查询的语法如下(在语法上基本上等同于原始语法,但更清晰):

    SELECT u.ID
    FROM c_User u
    WHERE EXISTS (
        SELECT 1
        FROM c_Group g 
        JOIN c_Member m ON g.Name = m.Parent_Name AND m.Child_Name = u.Lower_User_Name
        WHERE g.Group_Name LIKE 'mcp%'
    )
    

    【讨论】:

    • 非常感谢,您的解释很清楚,很中肯。我想我还有很长的路要走:P。
    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2013-04-19
    • 1970-01-01
    • 2021-07-08
    相关资源
    最近更新 更多