我有四张桌子a,b,c,d
。在表格a
中,我有一对id, name
。在表格b
中,我有一对idx, idy
。 b.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
我将来会遇到严重的性能问题。
答案 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
语法方面需要帮助,可以使用指南:
答案 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 )