5

尝试了一段时间后,我想我会尝试在这里要求改变。
我正在尝试检查两个表中是否存在人员 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)
4

2 回答 2

1

您的查询不是最简单的查询。你应该简化它。如果你想选择所有没有出现在 Booking 和 Resource 表中的人,你应该使用这个查询:

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 方言,但我认为您可以根据需要修改我的查询。

于 2013-04-11T05:02:23.047 回答
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

请注意,我的代码不需要实时运行,所以我更关心易用性而不是性能。(我喜欢子查询,因为它们清楚地分隔了不同的规则,我猜其他人可能也更喜欢加入,这是有充分理由的,除了性能之外)。

于 2013-04-13T23:11:47.257 回答