假设我有一个名为 entity 的表,其中包含以下列:
id | 标志 | foreignKey |的 parentEntityId
其他说明
我必须收集一些具有以下限制条件的数据:
:D
] :p
] :/
?< / LI>
我无法使用自联接
来满足最后一个约束
-- I Finally ended up with a sub-query (which returns what I need) :
SELECT e.*
FROM entity e
WHERE e.flag='15'
-- gathering entities ids where foreignKey has a specific value
AND e.id NOT IN
(SELECT GROUP_CONCAT(DISTINCT CONVERT(parentId , CHAR(8)) SEPARATOR ",")
FROM entity where foreignKey='10'
GROUP BY id
);
我的问题是......这可以通过“自我加入”表达来实现吗?
答案 0 :(得分:2)
像这样的东西(对于文中的条件):
select e.*
from entity e
where e.foreignKey = 0 and
e.flag in (0, 15) and
not exists (select 1 from entity e2 where e2.parentid = e.id);
答案 1 :(得分:2)
这是您的自我加入方法,在这种情况下也称为反连接:
SELECT e1.*
FROM entity e1
LEFT JOIN entity e2
ON e2.parentEntityId = e1.id
WHERE e1.flag = 15
AND e1.foreignKey = 0
AND e2.id IS NULL
您不必担心匹配parentEntityId
的记录数量,因为它是反加入(您排除任何匹配的记录)。< / p>
答案 2 :(得分:0)
我认为你太复杂了。 为什么不使用这么简单的查询?
SELECT e.*
FROM entity e
WHERE e.flag='15'
AND e.parentEntityId NOT IN
(SELECT DISTINCT id FROM entity e
);
以这种方式过滤掉所有子实体。