2016-01-21 52 views
0

我有3個表:SQL連接不是一對一的

# t1 
id | name | description 
1 | n1 | d1 
2 | n2 | d2 
3 | n3 | d3 

# t2 
id | idt1 | project | url 
1 | 1 | p1 | u11 
2 | 1 | p2 | u12 
3 | 2 | p2 | u22 
4 | 3 | p1 | u31 

我想有一個顯示是這樣的兩件事情的SQL查詢:

a)備選方案1:顯示在t1中的所有元素對於P2

t1.name t2.project t2.url 
    n1  p2   url12 
    n2  p2   url22 
    n3  p2   null 

b A項目)選項2:顯示所有的項目在t1中的所有元件和選擇列名是該項目,如果數據不存在顯示空

t1.name t2.project.p1 t2.project.p2 
    n1   url11  null  
    n2   url21  url22 
    n3   url31  null 

目前我只使用下面的查詢管理,以創建選項1的部分):

select t1.name, t2.project, t2.url from t1 
    right join t2 on (t1.id = t2.idt1) 

任何幫助嗎?

+0

大多數人覺得'左連接'夠詭異了,找到'右連接'是不可能理解的。如果你想編寫易於維護的代碼,如果可能的話,堅持左連接。 – jarlh

+0

好的...但是左邊加入怎麼樣?我不知道該怎麼做:( – jlanza

+0

't1右連接t2'與't2 left join t1'具有相同的結果。 – jarlh

回答

0

對於選項1)我已經找到了答案:

select * from 
     (select t1.name as name, sp.url as url, sp.ontology as project 
     from t1 ph 
     left outer join t2 sp on (ph.id = sp.idt1) 
     where sp.project = 'p2' 

     union 

     select t1.name as name, null, null 
     from t1 ph 
     ) both_tables 
    group by both_tables.name; 

我不知道這是否是最佳的,但它的工作原理;)我仍然工作在選項2),使其自動不管有多少項目。