【问题标题】:SQL View with Data from two tables来自两个表的数据的 SQL 视图
【发布时间】:2010-06-13 03:12:23
【问题描述】:

我似乎无法破解 - 我有两个表(PersonsCompanies),我正在尝试创建一个视图:

  1. 显示所有人

  2. 也自己返回公司一次,不管有多少人与之相关

  3. 两个表中按名称排序

为了澄清,一些示例数据:

(Table: Companies)
Id  Name
 1  Banana
 2  ABC Inc.
 3  Microsoft
 4  Bigwig

(Table: Persons)
Id  Name      RelatedCompanyId
 1  Joe Smith 3
 2  Justin    
 3  Paul Rudd 4
 4  Anjolie
 5  Dustin    4

我正在寻找的输出是这样的:

 Name      PersonName CompanyName RelatedCompanyId
 ABC Inc.  NULL       ABC Inc.    NULL
 Anjolie   Anjolie    NULL        NULL
 Banana    NULL       Banana      NULL
 Bigwig    NULL       Bigwig      NULL
 Dustin    Dustin     Bigwig      4
 Joe Smith Joe Smith  Microsoft   3
 Justin    Justin     NULL        NULL
 Microsoft NULL       Microsoft   NULL
 Paul Rudd Paul Rudd  Bigwig      4

如您所见,新的“名称”列在两个表中都按顺序排列(公司名称正确显示在人名之间),并且每家公司只出现一次,无论有多少人与之相关。

这甚至可以在 SQL 中完成吗?!附言我正在尝试创建一个视图,以便稍后可以使用它来轻松检索数据、全文索引并通过查询视图来简化编程方面。

【问题讨论】:

    标签: sql sql-server sql-server-2008 views


    【解决方案1】:

    这是一种方法:

    select * from (
        select Name, null as PersonName, Name as CompanyName, null as RelatedCompanyID
        from Companies
        union
        select Persons.Name as Name, Persons.Name as PersonName, Companies.Name as CompanyName, RelatedCompanyID
        from Persons
        left join Companies on Persons.RelatedCompanyID = Companies.ID
    ) as AggregatedData
    order by AggregatedData.Name
    

    或者使用公共表表达式稍微更易读,尽管在这种情况下没有其他真正的好处:

    with AggregatedData as (
        select Name, null as PersonName, Name as CompanyName, null as RelatedCompanyID
        from Companies
        union 
        select Persons.Name as Name, Persons.Name as PersonName, Companies.Name as CompanyName, RelatedCompanyID
        from Persons
        left join Companies on Persons.RelatedCompanyID = Companies.ID
    )
    select * from AggregatedData
    order by AggregatedData.Name
    

    【讨论】:

    • 我会避免使用公用表表达式——它不能移植到所有数据库,也不能真正提高可读性。如果它改进了查询优化,我只会考虑使用它。
    • 公用表表达式是 SQL-99 的补充,仅 MS SQL Server、Oracle 和 DB2 支持(据我所知)。
    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    相关资源
    最近更新 更多