2012-07-03 63 views
1

好吧,這是我的問題。假設一個用戶訪問一個CustomerRegions表中定義多個區域:選擇所有,如果沒有子集存在,否則選擇子集

CustomerRegionID | CustomerID | RegionID 
---------------------------------------- 
       1 |   1 |  1 
       2 |   1 |  2 

假設客戶1有三個用戶1,2,和3。對於每個用戶可以指定它們有CustomerRegions的通過表格UserRegions訪問:

UserRegionID | UserID | CustomerRegionID 
---------------------------------------- 
      1 |  1 |    1 
      2 |  1 |    2 
      3 |  2 |    2 

所以用戶1將有權訪問兩個Customerregions和用戶2將只需要CustomerRegion 2.

訪問如果存在對於給定的用戶則只有那些CustomerRegions指定UserRegions存在在結果集中,但如果沒有爲給定用戶指定UserRegions,則所有CustomerRegions都存在於結果中。我想獲得給定客戶的每個用戶的所有可訪問區域。我正在尋找的結果是這樣的:

CustomerID | UserID | RegionID 
------------------------------ 
     1 |  1 |  1 
     1 |  1 |  2 
     1 |  2 |  2 
     1 |  3 |  1 
     1 |  3 |  2 

我的問題是可以這樣做在一個單一的查詢,以及如何?

編輯: 我似乎現在的工作:

SELECT CustomerID, 
    UserID, 
    RegionID 
FROM users 
LEFT JOIN customerregions ON customerregions.CustomerID = users.CustomerID 
LEFT JOIN userregions ON userregions.UserID = users.UserID AND userregions.CustomerRegionID = customerregions.CustomerRegionID 
LEFT JOIN regions ON regions.RegionID = customerregions.RegionID 
WHERE (userregions.UserID IS NOT NULL 
    OR (SELECT COUNT(1) FROM userregions WHERE userregions.UserID = users.UserID) = 0) 
    AND CustomerID = 1 

在那裏額外的數查詢,似乎這樣的伎倆。感謝@Pablo Martinez的幫助。但是,如果有人知道更好的方法來做到這一點,請讓我知道。

+0

表結構是如此混亂 – diEcho

回答

0

我AGGRE與@diEcho,表結構非常混亂

有你嘗試做一個加入?

Select CustomerID, UserID, RegionID 
    from UserRegions join CustomerRegion 
     on CustomerRegion.CustomerRegionID=UserRegions.CustomerRegionID 
    where customerID=1 
+0

是的,我已經試過了,但它只是解決方案的一部分。這給用戶1和用戶2可訪問的區域,但用戶3被省略。沒有指定用戶區域的用戶應該可以訪問所有客戶區域。 –

+0

然後使用OUTHER JOIN(取決於)與表用戶選擇所有用戶。沒有用戶區域的用戶將爲NULL –