我正在尝试为数据库创建一个新界面,但我不知道如何做我想要的 我有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
我已经尝试了很多请求,但没有效率。
拜托,帮帮我^^
编辑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) ) )
答案 0 :(得分:1)
答案可能因数据库而异,这适用于SQL Server,您需要CROSS JOIN
来获取table1
和table2
的每个组合,然后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