2013-04-10 36 views
5

经过一段时间,我想我会试着在这里问一个改变。
我想检查是否在两个表中存在人的ID,为一个表它就像一个魅力,但如果我尝试检查另一个表,我得到以下错误:检查id是否在外表中存在两次

[Semantical Error] line 0, col 268 near 'owner FROM \...\Entity\Resource':
Error: Invalid PathExpression. Must be a 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

我最终使用子查询来解决它。加盟可能会更快,但我失去了他们的踪迹。 (他们给了我在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 

请注意,我的代码并不需要运行实时的,所以我照顾容易使用超过性能。 (我喜欢子查询,因为它们明显地分开了不同的规则,我想其他人可能会喜欢更好地加入,这是因为有良好的原因,旁边是性能)。

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