5

しばらく試した後、ここで変更を依頼しようと思いました。
個人IDが2つのテーブルに存在するかどうかを確認しようとしています.1つのテーブルでは魅力的に機能しますが、別のテーブルを確認しようとすると次のエラーが発生します:

[セマンティカル エラー] 'owner FROM \...\Entity\Resource' 付近の行 0、列 268:
エラー: 無効なパス式。StateFieldPathExpression である必要があります。

秘訣は、1 つの 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 に答える