2012-02-21 65 views
1

我在數據庫中有三代表 - 與ACTIVITY_ID外連接SQL表?

  1. 活動表,與CATEGORY_ID ACTIVITY_TYPE
  2. 分類表,CATEGORY_NAME
  3. 鏈接表ACTIVITY_ID之間的映射和CATEGORY_ID

我需要編寫選擇語句以獲得以下數據:

activity_id, activity_type, Category_name. 

問題是一些activity_id在鏈接表中沒有條目。

如果我寫:

select a.activity_id, a.activity_type, c.category_name 
from activity a, category c, link l 
where a.activity_id = l.activity_id and c.category_id = l.category_id 

然後我沒有得到的數據是不存在的鏈接表的activity_ids。 我需要將所有具有空值或空值的活動的數據作爲category_name,以獲得那些沒有任何category_id鏈接的數據。

請幫幫我吧。

PS。我正在使用MS SQL Server DB

+2

不要使用那些舊式的隱式'JOIN's! **永遠!** – JNK 2012-02-21 16:23:31

+0

然後任何其他解決方案? – 2012-02-21 16:27:24

+2

使用明確的'JOIN'語法。 – JNK 2012-02-21 16:27:46

回答

2

我相信你正在尋找一個LEFT OUTER JOIN爲你的活動表來返回所有行。

SELECT 
a.activity_id, a.activity_type, c.category_name 
FROM activity a 
LEFT OUTER JOIN link l 
ON a.activity_id = l.activity_id 
LEFT OUTER JOIN category c 
ON c.category_id = l.category_id; 
2

你應該用正確的明確連接:

select a.activity_id, a.activity_type, c.category_name 
from activity a 
LEFT JOIN link l 
ON a.activity_id = l.activity_id 
LEFT JOIN category c 
ON l.category_id = c.category_id 
0

怎麼樣?

select a.activity_id, a.activity_type, c.category_name from category c 
left join link l on c.category_id = l.category_id 
left join activity a on l.activity_id = a.activity_id 

事實上,先加入看來,它可能是一個inner join,因爲你沒有提到可能會有一些遺漏的元素有

+0

給出相同的舊結果。 – 2012-02-21 16:38:30

1

如果寫這種類型的邏輯將是你正在進行的一部分責任,我強烈建議你對連接進行一些研究,包括連接和where子句之間的相互作用。無論用於檢索數據的技術如何,連接和where子句結合起來形成查詢寫入的主幹。

最關鍵的加盟信息,以瞭解:

  • 左外連接:檢索來自「左」表中存在的連接表
  • 內加入所有的信息和任何記錄:僅檢索存在的記錄在這兩個表中
  • Where子句:用於限制數據,不管內部或外部聯接定義。

在您發佈的示例中,where子句將您的總體數據限制爲存在於所有3個表中的行。用適當的連接邏輯替換where子句將會訣竅:

select a.activity_id, a.activity_type, c.category_name 
from activity a 
    left outer join link l --return all activity rows regardless of whether the link exists 
      on a.activity_id = l.activity_id 
left outer join category c --return all activity rows regardless of whether the link exists 
      on c.category_id = l.category_id 

祝你好運!