你不需要客戶ID選擇?就目前而言,您是不是每個客戶都運行一次子查詢,並獲得一串真或假的值,而不知道哪一個適用於哪個客戶?
如果這是您所需要的,則不需要引用customers表(除非您保持數據庫處於語義分離狀態,並且customer_notes中可能存在沒有相應客戶的條目 - 但是你有比這個查詢的性能更大的問題);您可以簡單地使用:
SELECT DISTINCT Customer_ID
FROM Customer_Notes
ORDER BY Customer_ID;
獲取Customer_Notes表中至少有一個條目的客戶ID值列表。
如果你想客戶ID值和相關的真/假值的列表,那麼你需要做一個連接:
SELECT C.Customer_ID,
CASE WHEN N.Have_Notes IS NULL THEN 0 ELSE 1 END AS Has_Notes
FROM Customers AS C
LEFT JOIN (SELECT Customer_ID, COUNT(*) AS Have_Notes
FROM Customer_Notes
GROUP BY Customer_ID) AS N
ON C.Customer_ID = N.Customer_ID
ORDER BY C.Customer_ID;
如果這給表現不佳,檢查是否有Customer_Notes指數。客戶ID。如果這不是問題,請研究查詢計劃。
不能做......在視圖
對什麼是允許在視圖中始終處於任何DBMS一個令人討厭的小限制(MySQL的不單單是有限制)。但是,我們可以通過單個常規聯接來完成。我剛想起來。 COUNT(column)
僅計算非空值,返回0,如果所有值都爲空,所以 - 如果你不介意的計數,而不是僅僅0或1 - 您可以使用:
SELECT C.Customer_ID,
COUNT(N.Customer_ID) AS Num_Notes
FROM Customers AS C
LEFT JOIN Customer_Notes AS N
ON C.Customer_ID = N.Customer_ID
GROUP BY C.Customer_ID
ORDER BY C.Customer_ID;
如果你絕對必須有0或1:
SELECT C.Customer_ID,
CASE WHEN COUNT(N.Customer_ID) = 0 THEN 0 ELSE 1 END AS Has_Notes
FROM Customers AS C
LEFT JOIN Customer_Notes AS N
ON C.Customer_ID = N.Customer_ID
GROUP BY C.Customer_ID
ORDER BY C.Customer_ID;
注意,使用「N.Customer_ID」是至關重要的 - 儘管表中的任何列會做(但你沒有泄露任何其他列,AFAICR名稱)和爲了清楚起見,我通常會使用除加入列之外的其他內容。
我想你想重寫它爲'EXISTS'查詢而不是'JOIN'。 – Gabe 2010-12-16 23:25:48