2013-04-10 33 views
5

Sau khi thử một lúc, tôi nghĩ tôi sẽ cố gắng yêu cầu thay đổi.
Tôi cố gắng để kiểm tra xem một người id tồn tại trong hai bảng, một bảng nó hoạt động như một nét duyên dáng, nhưng nếu tôi cố gắng để kiểm tra một bảng tôi nhận được lỗi sau:Kiểm tra xem id có tồn tại trong bảng ngoài không hai lần

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

Bí quyết là Tôi chỉ có thể sử dụng một truy vấn DQL và sau đây là những gì tôi đã đưa ra (... không phải trong truy vấn thực tế):

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) 

Trả lời

0

Cuối cùng tôi đã giải quyết nó bằng truy vấn phụ. Tham gia có thể nhanh hơn nhiều nhưng tôi mất dấu chúng. (Và họ đã cho tôi đau đầu rất lớn trong DQL)

Dù sao cách tôi giải quyết nó là như thế này:

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

Do lưu ý rằng mã của tôi không cần phải chạy theo thời gian thực, vì vậy tôi chăm sóc cho dễ dàng sử dụng nhiều hơn hiệu suất. (Tôi thích các truy vấn phụ vì họ rõ ràng tách biệt các quy tắc khác nhau, tôi đoán những người khác có thể thích tham gia tốt hơn vì một lý do chính đáng, bên cạnh hiệu suất).

1

Truy vấn của bạn không phải là dễ nhất. Bạn nên đơn giản hóa nó. Nếu bạn muốn chọn tất cả những người không xuất hiện trong cả bảng Đặt chỗ và Tài nguyên, bạn nên sử dụng truy vấn này:

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 

Tham gia nhanh hơn nhiều truy vấn phụ trên mỗi hàng. Và truy vấn này rõ ràng hơn.

PS. Xin lỗi tôi không biết phương ngữ DQL nhưng tôi nghĩ bạn có thể sửa đổi truy vấn của tôi cho nhu cầu của bạn.

Các vấn đề liên quan