2009-11-22 37 views
3

(不知道這個問題的名字還真是有道理的,但我想要做的是非常簡單的)SQL:在一個表中查找另一個表中多個值的相同字段?

鑑於表看起來是這樣的:

Table Foo 
--------------------------------- 
| bar1_id | bar2_id | other_val | 
--------------------------------- 

Table Bar 
-------------------- 
| bar_id | bar_desc| 
-------------------- 

我將如何創建一個選擇即我想從富抓住每一行,並添加含欄bar_id的描述列

--------------------------------------------------------- 
| bar1_id | bar1_desc | bar2_id | bar2_desc | other_val | 
--------------------------------------------------------- 

:這將返回一個表,將如下所示。所以Bar中可能有一些行不在結果集中,但Foo的每一行都應該放在結果集中。

此外,這是postgres,如果這有所作爲。

回答

2
SELECT F.bar_id1, 
    (SELECT bar_desc FROM Bar B WHERE (F.bar_id1 = B.bar_id)), 
    F.bar_id2, 
    (SELECT bar_desc FROM Bar B WHERE (F.bar_id2 = B.bar_id)), 
    F.other_val 
FROM FOO F; 
+0

我的身份發生了什麼? :( – 2009-11-22 15:58:49

+1

用四個空格前綴代碼(有一個快速執行的按鈕:選擇代碼,然後CTRL-K) – Andomar 2009-11-22 16:00:47

1
SELECT 
    foo.bar1_id, bar1.bar_desc AS bar1_desc, 
    foo.bar2_id, bar2.bar_desc AS bar2_desc, 
    foo.other_val 
FROM 
    foo 
    INNER JOIN bar bar1 ON bar1.id = foo.bar1_id 
    INNER JOIN bar bar2 ON bar2.id = foo.bar2_id 

這是假設你永遠既有bar1_idfoo一個bar2_id。如果這些可以是null,則將INNER JOIN更改爲LEFT OUTER JOIN

0
select f.bar1, b1.desc, f.bar2, b2.desc, f.value 
from foo as f, bar as b1, bar as b2 
where f.bar1 = b1.id 
    and f.bar2 = b2.id 
2

這並不直接回答你的問題(但沒關係,上面已經是人),但...

這被認爲是非常設計。未來當你的foo可以與3個酒吧相關時會發生什麼?或者更多? (不要說它永遠不會發生,我已經失去了多年來實施的「永遠不會發生」的事情)。

一般來說,正確的方法是做一對多的關係(每個條指向一個foo,或者一箇中間foo-bar表,參見many-to-many relationships)。現在,您可以正確地在前端格式化輸出,並且只需獲取每個foo的條形列表即可傳遞給它(SQL中很容易實現)。報告是一種特殊情況,但仍然可以通過pivoting或CrossTab queries來實現。

+0

+1用於標準化 – scribble 2009-11-22 16:21:40

+0

我非常瞭解設計含義。我只是在處理由別人創建的數據庫,而且在這種情況下,Foo真的不可能變得更大,因爲它描述的結構本質上是雙面的。 – 2009-11-22 16:33:38

相關問題