【问题标题】:How to Join the same named columns of different tables如何连接不同表的相同命名列
【发布时间】:2011-06-08 07:22:29
【问题描述】:

在这里,我更简单地描述了我的问题,即我需要什么样的查询:

假设我有三个表 AccessPolicy、Document 和 Term。在这里,AccessPolicy 的名称和文档的名称都存储在“Term”表中。我需要从 3 个表中返回以下字段。我需要在单个选择查询中分别为 AccessPolicy 和 Document 获取 Name 字段两次。

Term.Name as AccessPolicyName
Term.Name as DocumentName
AccessPolicy.TermID
Document.TermID
Document.UserName
AccessPolicy.ValidFrom

如何形成一个选择查询来返回上述结果?

我需要在 Oracle 11g 中执行此操作。

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:
    select
        Term.Name as AccessPolicyName,
        Term.Name as DocumentName,
        AccessPolicy.TermID,
        Document.TermID,
        Document.UserName,
        AccessPolicy.ValidFrom
    from Term t
    left join AccessPolicy ap on ap.Name = t.Name
    left join Document d on d.Name = t.Name;
    

    请注意,AccessPolicy 和 Document info 都可能为 null

    【讨论】:

    • 你需要在select的列引用中使用别名,否则会抛出ORA-00904。 t.Nameap.TermID
    【解决方案2】:

    你还没有说这些表是如何相关的。推测AccessPolicyDocument 表中的TermIDTerm 表中的条目相关,可能由名为ID 的列标识。但我们不知道您是否期望两者都使用相同的 TermID - 所以有一个 Term 记录链接其他两个表。由于您两次提取名称,我认为不会,但是没有迹象表明 应该 如何进行连接。

    如果涉及两个 TermID 值,那么您需要加入 Term 两次,例如:

    select t1.Name as AccessPolicyName,
        t2.Name as DocumentName,
        ap.TermID as AccessPolicyTermID,
        d.TermID as DocumentTermID,
        d.UserName,
        ap.ValidFrom
    from AccessPolicy ap
    join Term t1 on t1.ID = ap.TermID
    join Document d on d.someColumn = ap.someColumn -- don't know how policy and document are related?
    join Term t2 on t2.ID = d.TermID
    

    【讨论】:

    • 嗨,亚历克斯,是的,你猜对了。我有不同的 TermId 用于 AccessPolicy 和 Document 以与 Term 表链接。根据您的设计,我能够获得所需的结果。此外,文档和 AccessPolicy 由 DocumentID 链接。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多