经过一段时间的努力,我想我会试着在这里要求改变 我试图检查一个人ID是否存在于两个表中,对于一个表,它就像一个魅力,但如果我尝试检查另一个表,我会收到以下错误:
[语义错误]第0行,第268行附近'owner FROM \ ... \ Entity \ Resource':
错误:无效的PathExpression。必须是StateFieldPathExpression。
诀窍是我只能使用一个DQL查询,以下是我想出的内容(...不在实际查询中):
SELECT contact_person
FROM \\...\Entity\Person contact_person
WHERE NOT EXISTS (SELECT b.personId FROM \\...\Entity\Booking b WHERE b.personId = contact_person.id)
AND NOT EXISTS (SELECT r.owner FROM \\...\Entity\Resource r WHERE r.owner = contact_person.id)
答案 0 :(得分:1)
您的查询不是最简单的查询。你应该简化它。如果要选择未出现在预订和资源表中的所有人,则应使用此查询:
SELECT contact_person.*
FROM Person contact_person
LEFT JOIN Booking b ON contact_person.id = b.personId
LEFT JOIN Resource r ON contact_person.id = r.owner
GROUP BY contact_person.id
HAVING COUNT(r.owner) = 0 AND COUNT(b.personId) = 0
连接比每行的子查询快得多。这个查询更清楚。
PS。对不起,我不懂DQL方言,但我认为您可以根据需要修改我的查询。
答案 1 :(得分:0)
我最终使用子查询解决了它。加入可能会快得多,但我会忘记它们。 (他们在DQL中让我头疼不已)
无论如何,我解决它的方式是这样的:
SELECT contact_person
FROM ...
WHERE (SELECT COUNT(b.personId) FROM \\...\Entity\Booking b WHERE b.personId=contact_person.id)=0
AND (SELECT COUNT...)=0
请注意我的代码不需要实时运行,所以我更关心易用性而不是性能。 (我喜欢子查询,因为他们清楚地分离了不同的规则,我想其他人可能会因为一个很好的理由而更好地加入,除了性能之外)。