LEFT JOIN在3个表上获取值

时间:2014-06-11 14:53:17

标签: sql ms-access-2007

我正在尝试为数据库创建一个新界面,但我不知道如何做我想要的 我有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或FROM ..

上仍然存在语法错误

编辑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) ) )

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您应首先交叉连接table1和table2以生成其笛卡尔积,并且左连接以获取存在的值:

 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用零替换空值。

答案 2 :(得分:0)

在你的问题中,你说Access“不支持CROSS JOIN”。虽然Access SQL不支持

... FROM tableX CROSS JOIN tableY ...

您只需使用

即可在Access中执行交叉联接
... FROM tableX, tableY ...

在你的情况下,

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