我有2个表:element和element_property。
我想选择其中一个属性不存在的所有元素。这意味着此查询不返回任何内容:
select * from element_property where PROPERTY_ID = 176 AND ELEMENT_ID = 123
但是有一行:
select * from element where ID = 123
所以,我想找到PROPERTY_ID = 176不存在的所有元素。
此变体不返回任何内容:
select t1.ID, t2.* from element t1
left JOIN element_property t2 ON t1.ID = t2.ELEMENT_ID
where t2.PROPERTY_ID = 176 and t2.ID IS NULL
答案 0 :(得分:1)
您遇到的问题是在连接后发生了t2.property_ID = 176的where子句。由于elment ID 123 doens没有属性176,因此它被排除在where子句之外。
通过将其移动到连接,您可以告诉引擎首先将所有elment_properties过滤为176,然后将其连接到元素。然后删除所有具有该元素的记录(其中T2.ID为空)
你的方法否定左连接基本上使它成为一个内连接。
因此,如果您将选择更新为此,则应该有效:
select t1.ID, t2.*
from element t1
left JOIN element_property t2
ON t1.ID = t2.ELEMENT_ID
and t2.PROPERTY_ID = 176
where t2.Element_ID IS NULL
让我们关注你的where子句。元素123不存在176的Property_ID。因此,通过说t2.property_ID = 176,你排除了元素123.
通过将限制移动到JOIN,您的结果集看起来就像没有where ...
Element Property ID
123 NULL NULL
003 NULL NULL
001 176 1
002 176 2
因此,在本例中,where属性为null,您将获得记录123和003。
但如果你说where property = 176且ID为null ......你就没有记录回来了。