2016-12-30 31 views
2

只包含價值觀,我有幾個辦公室的ID和幾個郵政編碼如何選擇,從一組

Office id Zip Code 
1111111  45220 
1111111  45221 
1111111  45214 
1111111  45215 
1111111  45216 
1111112  45220 
1111112  45221 
1111112  45214 
1111113  45220 
1111113  45221 
1111113  45214 
1111113  45215 

我的條件的行是選擇辦公ID,其中僅位於郵政編碼45220,45221和45214。並且辦公室ID不得包含任何其他郵政編碼。在上表中,僅顯示id 1111112。

+0

非常感謝您的幫助。這些真的很有幫助。我在列表中有幾個郵政編碼。所以我更新了我的查詢,不包括「count = 3」部分。 – Sailaja

回答

0

它可能是這樣的:

SELECT a.office_id 
    FROM mytable a 
      INNER JOIN mytable b 
       ON a.office_id = b.office_id 
    WHERE b.zip_code IN (45220,45221,45214) 
AND a.office_id not in 
(
    select office_id from mytable c 
    where c.zip_code NOT IN (45220, 45221, 45214) 
) 
    GROUP BY a.office_id 
    HAVING COUNT(*) = 3 
0

您可以使用子查詢,並加入像這樣:

SELECT office_id 
FROM your_table t1 
INNER JOIN 
    (SELECT office_id 
    FROM your_table 
    WHERE zip_code IN (45220,45221,45214) 
    GROUP BY office_id 
    HAVING COUNT(zip_code) = 3 
) t2 
ON t1.office_id = t2.office_id 
GROUP BY office_id 
HAVING COUNT(zip_code) = 3; 

您也可以使用設置操作except這樣的:

SELECT office_id 
    FROM your_table 
    WHERE zip_code IN (45220,45221,45214) 
    GROUP BY office_id 
    HAVING COUNT(zip_code) = 3 
    EXCEPT 
    SELECT office_id 
    FROM your_table 
    WHERE zip_code NOT IN (45220,45221,45214); 
+0

'except'是SQL標準,而'minus'不是 –

+0

@a_horse_with_no_name已更新。謝謝。我剛纔提到,因爲OP沒有提到DBMS – GurV

0

試試這個

select office_id from mytable where zip_code in(45220,45221,45214) group by office_id 
0
select distinct office from Locations 
where office NOT IN 
(
    select office from Locations 
    where zip NOT IN (45220, 45221, 45214) 
) 
and zip IN (45220, 45221, 45214) 
0

避免多個子查詢的另一種選擇,只需要對錶進行一次掃描,根據所使用的DBMS的不同,該掃描可能會更快。

select office_id 
from office 
group by office_id 
having min(case when zip_code in ('45220', '45221', '45214') then 1 else 0 end) = 1 
    and count(case when zip_code in ('45220', '45221', '45214') then 1 end) = 3; 

表達case when zip_code in ('45220', '45221', '45214') then 1 else 0 end將計算爲0,如果任何其他ZIP_CODE存在。這樣可以過濾出所有那些有三個以上郵政編碼的辦公室。

count(...)則可以確保辦公室沒有少那麼這三個郵政編碼。


如果使用Postgres的,還可以使用數組聚合以簡化代碼:

select office_id 
from office 
group by office_id 
having array_agg(zip_code order by zip_code) = array['45214', '45220', '45221'] 

注意數組元素必須以相同的順序['45214', '45220', '45221']是一個不同的陣列然後['45220', '45214', '45221']