0

我有四张桌子a,b,c,d。在表中a我有一对id, name. 在表中b我有一对idx, idy. 来自b.idya.id。在表中,c, d我有一对id, value与 table 相关b.idx

我必须执行这样的查询:

SELECT c.value, d.value 
FROM a,b,c,d
WHERE a.name = "test" AND b.idy = a.id AND (c.id = b.idx AND d.id = b.idx)

问题是有时表中缺少记录,c, d因此将返回零记录,但如果在或AND中可用,我需要有结果。我也不能使用,因为它也为两个表返回其他行。cdOR

我想会有一个使用UNION甚至只是嵌套SELECTs 的解决方案。我更喜欢不使用JOIN或使用单独的查询。

提前致谢!

更新:

避免使用的原因JOIN是性能。我现在正在处理的结构比这个复杂得多,所以我确信JOIN在即将到来的将来我会遇到严重的性能问题。

4

3 回答 3

2

我想你想使用一个LEFT JOIN

SELECT c.value, d.value 
FROM a
LEFT JOIN b
    ON a.id = b.idy
LEFT JOIN c
    ON b.idx = c.id
LEFT JOIN d
    ON b.idx = d.id
WHERE a.name = "test" 

使用逗号连接语法INNER JOIN要求记录在所有表中都可用。

如果您在复习JOIN语法方面需要帮助,有一个有用的指南:

SQL 连接的可视化解释

于 2012-09-20T17:47:40.367 回答
1
select c.value, d.value
from a
inner join b on b.idy = a.id
left outer join c on c.id = b.idx
left outer join d on d.id = b.idx
where a.name = "test" 
    and coalesce(c.id, d.id) is not null
于 2012-09-20T17:46:14.537 回答
1
SELECT c.value, d.value 
FROM a,b,c,d
WHERE a.name = "test" AND b.idy = a.id AND (c.id = b.idx AND d.id = b.idx)
UNION
SELECT c.value, NULL
FROM a,b,c
WHERE a.name = "test" AND b.idy = a.id AND c.id = b.idx AND NOT EXISTS( SELECT NULL FROM d where d.id = b.idx )
UNION
SELECT NULL, d.value
FROM a,b,d
WHERE a.name = "test" AND b.idy = a.id AND d.id = b.idx AND NOT EXISTS( SELECT NULL FROM c where c.id = b.idx )
于 2012-09-20T17:53:59.770 回答