3

我有一个小问题,我被困住了。我有两张桌子。第一个包含所有 id,第二个包含一些,但不是全部来自 tableA,一个值和一个相应的标识符。正如我认为我已经理解的那样,如果表B中不存在id,则id的左连接应该给我第一个表中的所有id,第二个表为null。但我不断获得两个表中存在的 id 数量。我理解错了吗?

到目前为止,我的声明是:

SELECT tableA.id, tableB.desiredValue
FROM tableA 
LEFT JOIN tableB ON tableA.id=tableB.item_id
WHERE tableB.element_id = 'something'
OR tableB.element_id IS NULL;

任何指针?

谢谢,最好的问候,马库斯

4

3 回答 3

2

将涉及tableB列的条件从WHERE移至ON

SELECT tableA.id, tableB.desiredValue
FROM tableA 
LEFT JOIN tableB ON  tableA.id=tableB.item_id
                 AND tableB.element_id = 'something'

--- WHERE tableB.element_id IS NULL        --- this is probably not appropriate
;
于 2012-05-09T12:40:27.447 回答
0

尝试这个

SELECT tableA.id, tableB.desiredValue
FROM tableA 
LEFT JOIN tableB ON tableA.id=tableB.item_id
AND (tableB.element_id = 'something'
OR tableB.element_id IS NULL);
于 2012-05-09T12:32:49.690 回答
0

一般来说,这似乎应该工作。但是,我会在 where 子句中更具体一些:

SELECT tableA.id, tableB.desiredValue
FROM tableA 
LEFT JOIN tableB ON tableA.id = tableB.item_id
WHERE tableB.element_id = 'something' OR tableB.item_id IS NULL;

我已经替换item_id为我要检查的行NULL——尽管它应该有所不同,除非element_id它可以NULL在连接起作用的行中。

您能否详细说明为什么要使用 where 子句的其他部分 - tableB.element_id = 'something'?如果您只想返回所有行,我的一般建议是完全消除 WHERE 子句。

你能解释一下你想要返回的行的标准是什么吗?

于 2012-05-09T12:43:12.330 回答