2010-06-13 71 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