2010-06-13 130 views
0

我似乎无法破解这 - 我有两个表(PersonsCompanies),而我试图创建一个观点,即:SQL视图的数据与来自两个表

  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 ?!附:我试图创建一个视图,以便稍后可以使用它来轻松进行数据检索,全文索引,并通过查询视图使编程更简单。

回答

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 
+0

我避免了普通表表达式 - - 它不可移植到所有数据库,并且不会真正提高可读性。如果它改进了查询优化,我只会考虑使用它。 – 2010-06-13 03:39:41

+0

公用表表达式是SQL-99的补充,并且仅被MS SQL Server,Oracle和DB2支持(据我所知)。 – 2010-06-13 03:52:24