2012-01-28 53 views
3

我正在尋找一種更有效的方式來建立這個查詢記錄(雙子查詢讓我畏縮):那裏獲取相關表中的所有值均爲空

SELECT contact_id FROM (
    SELECT * FROM (
    SELECT mr.contact_id, di.district 
    FROM recipients mr 
    JOIN address a ON mr.contact_id = a.contact_id 
    JOIN district_values di ON a.id = di.entity_id 
    WHERE mr.mid = 29 
    ORDER BY di.district DESC) addrSingle 
    GROUP BY mr.contact_id) addrNull 
WHERE di.district IS NULL 

讓我解釋一下是怎麼回事。

收件人擁有聯繫人列表。每個聯繫人可能有多個地址。每個地址都有一個相關的district_values表。我需要檢索所有地址的district_values.district列爲空的聯繫人。

例如:

Contact A 
Address 1.district = 4 
Address 2.district = null 
= don't include 

Contact B 
Address 1.district = null 
= include 

Contact C 
Address 1.district = null 
Address 2.district = 3 
= don't include 

我現有查詢的邏輯如下:

  1. 檢索與相關地址和地區,爲了讓與非空值的任何地址的聯繫人首先訂購
  2. 適用於所有組,如果我減少到單個聯繫人記錄,並且如果地區與地區保留
  3. 適用where子句與至少一個區價值

它的工作原理刪除地址 - 它只是有點難看。

回答

2

你可以試試這個,使用LEFT JOIN並計算相關記錄爲零。

SELECT mr.contact_id 
    FROM recipients mr 
LEFT JOIN address a ON mr.contact_id = a.contact_id 
LEFT JOIN district_values di ON a.id = di.entity_id 
    WHERE mr.mid = 29 
GROUP BY mr.contact_id 
    HAVING COUNT(a.*) = 0 AND COUNT(di.*) = 0 
+0

返回聯繫人沒有相關的a行或di行的記錄。我需要的是鏈接記錄的位置,但所有相關記錄的di.district值都爲空。該表中還有其他列 - 我的限制是在di.district值。 – lcdservices 2012-01-28 23:02:26

+1

我能夠適應這一點,它似乎做的更好。我只是將HAVING子句更改爲:HAVING COUNT(di.district)= 0 – lcdservices 2012-01-28 23:19:55