2013-04-10 18 views
5

Po krótkiej próbie pomyślałem, że spróbuję poprosić o zmianę.
Próbuję sprawdzić, czy dana osoba id występuje w dwóch tabelach, na jednym stole działa jak uroku, ale gdy próbuję sprawdzić innej tabeli pojawia się następujący błąd:Sprawdź, czy identyfikator istnieje w zagranicznej tabeli dwa razy.

[Semantical Error] line 0, col 268 near 'owner FROM \...\Entity\Resource':
Error: Invalid PathExpression. Must be a StateFieldPathExpression.

Sztuką jest to, że mogę używać tylko jednego zapytania DQL i oto co wymyśliłem (... nie w rzeczywistej kwerendy):

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) 

Odpowiedz

0

Ostatecznie rozwiązałem go, używając podzapytań. Połączenia mogą być znacznie szybsze, ale tracę z nich kontakt. (I dali mi ogromny ból głowy w DQL)

każdym razie tak, jak rozwiązać to tak:

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

Należy pamiętać, że mój kod nie musi działać w czasie rzeczywistym, więc zależy mi na łatwe wykorzystania więcej niż wydajność. (Lubię podkwerendy, ponieważ wyraźnie oddzielają się od różnych reguł, myślę, że inni ludzie mogą polubić łączenia również z dobrego powodu, obok wydajności).

1

Twoje zapytanie nie jest najłatwiejszą. Powinieneś to uprościć. Jeśli chcesz wybrać wszystkie osoby, które nie pojawiają się w obu Rezerwacja i stoły zasób powinien użyć tej kwerendy:

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 

przyłącza są znacznie szybsze niż podzapytania na każdym rzędzie. Ta kwerenda jest bardziej przejrzysta.

PS. Niestety nie znam dialektu DQL, ale myślę, że możesz zmodyfikować moje zapytanie do swoich potrzeb.