2014-06-11 42 views
0

我試圖爲數據庫創建新接口,但我不知道如何執行我想要的操作。
我有3個表:在3個表上左加入以獲得值

- table1(id1, time, ...) 
id11 .. 
id12 .. 
id13 .. 

- table2(id2, price, ...) 
id21 .. 
id22 .. 
id23 .. 

- table1_table2(#id1, #id2, value) 
id11, id22, 6 
id11, id23, 10 
id13, id22, 5 

所以我想有這樣的事情:

id11, id21, 0 
id11, id22, 6 
id11, id23, 10 
id12, id21, 0 
id12, id22, 0 
id12, id23, 0 
id13, id21, 0 
id13, id22, 5 
id13, id23, 0 

我試過很多的請求,但沒有有效的..
請幫我^^

編輯:我使用的是Access(:'()2007年,顯然,它不支持CROSS JOIN ... 我試圖用這樣的:http://blog.jooq.org/2014/02/12/no-cross-join-in-ms-access/ ,但仍對JOIN或從語法錯誤..

編輯2:這裏是我的查詢(我是法國人,所以不要把名字照顧取悅^^)

SELECT Chantier.id_chantier, Indicateur.id_indicateur, Indicateur_chantier.valeur 
     FROM ((Chantier INNER JOIN Indicateur ON (Chantier.id_chantier*0 = Indicateur.id_indicateur*0)) 
     LEFT JOIN Indicateur_chantier ON ((Chantier.id_chantier = Indicateur_chantier.id_chantier) 
     AND (Indicateur.id_indicateur = Indicateur_chantier.id_indicateur))) 
+1

什麼是數據庫你在用嗎? SQL Server,MySQL ...? –

+0

看起來你想在前兩個表格之間使用'CROSS JOIN'。這可能會導致大量的數據! – MicSim

+0

我知道,但這是我想要的;) –

回答

1

你應該先交叉連接表1和表2生產它們的笛卡爾乘積和左連接來獲得,其中存在的價值:

SELECT t1.id1,t2.id2,ISNULL(t12.value,0) 
FROM table1 t1 
CROSS JOIN table2 t2 
LEFT JOIN table1_table2 t12 on t12.id1=t.id1 and t12.id2=t2.id2 

最後使用ISNULL以取代空值零。

+0

謝謝!我不知道CROSS JOIN即使存在! –

1

答案可能通過數據庫不同,這部作品在SQL Server中,你需要一個CROSS JOIN得到的table1table2每一個組合,然後LEFT JOIN與價值迴歸對:

SELECT a.id1, b.id2, COALESCE(c.value,0) 
FROM table1 a 
CROSS JOIN table2 b 
LEFT JOIN table3 c 
    ON a.id1 = c.id1 
AND b.id2 = c.id2 

偶沒有價值將返回NULL,所以ÿ您可以使用COALESCE()來返回0。

演示:SQL Fiddle

0

在你的問題中,你說Access「不支持CROSS JOIN」。雖然這是事實,訪問SQL不支持

... FROM tableX CROSS JOIN tableY ... 

可以執行跨只需使用

... FROM tableX, tableY ... 

在你的情況在Access加盟,

SELECT 
    crossjoin.id1, 
    crossjoin.id2, 
    Nz(table1_table2.value, 0) AS [value] 
FROM 
    (
     SELECT table1.id1, table2.id2 
     FROM table1, table2 
    ) AS crossjoin 
    LEFT JOIN 
    table1_table2 
     ON table1_table2.id1 = crossjoin.id1 
      AND table1_table2.id2 = crossjoin.id2 
ORDER BY crossjoin.id1, crossjoin.id2