简单但嵌套的SELECT查询

时间:2012-09-20 17:43:44

标签: sql select join union

我有四张桌子a,b,c,d。在表格a中,我有一对id, name。在表格b中,我有一对idx, idyb.idy来自表格a.id。在表格c, d中,我有一对id, value与表格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将返回零记录,但如果c或{{1}中有可用,我需要有结果}}。此外,我无法使用d,因为它也为两个表返回其他行。

我想使用OR甚至只是嵌套UNION的解决方案。我更喜欢不使用SELECT或使用单独的quires。

提前致谢!

更新

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

3 个答案:

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

答案 1 :(得分:1)

我想你想使用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语法方面需要帮助,可以使用指南:

A Visual Explanation of SQL Joins

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