2013-04-10 6 views
5

しばらくしてから、私はここで変更を求めようとしました。
私は1つのテーブルのために、それは魔法のように動作しますが、私は、私は次のエラーを取得する別のテーブルをチェックしようとした場合、人物IDが2つの表に存在するかどうかを確認しようとしています:IDが外部テーブルに2回あるかどうか確認してください

[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

私は最終的にサブクエリを使用して解決しました。結合ははるかに速いかもしれませんが、私はそれらの追跡を失います。私のコードがリアルタイムに実行する必要はありませんので、私は簡単の世話ことに注意してください

SELECT contact_person 
FROM ... 
WHERE (SELECT COUNT(b.personId) FROM \\...\Entity\Booking b WHERE b.personId=contact_person.id)=0 
AND (SELECT COUNT...)=0 

:とにかく、私はそれがこのようなものです解決方法を

を(そして、彼らは私にDQLに大きな頭痛の種を与えました)パフォーマンス以上の使用。 (私はサブクエリが好きです。異なるルールをはっきりとはっきりと区別しているからです。パフォーマンスの次に、他の人がジョインを好きな理由があると思います)。

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方言は分かりませんが、あなたのニーズに合わせてクエリを変更できると思います。

関連する問題