2012-02-20 169 views
0

下表具有與城市一起的人,他們在工作過的ID號:SQL:查詢基於多個記錄

PERSON_NO | CITY_NAME 
--------------------- 
1   | City A 
2   | City B 
3   | City A 
3   | City B 
3   | City C 
4   | City A 
4   | City B 
4   | City C 

我如何將能夠得到所有誰住人的PERSON_NO在所有三個城市中,A,B和C?

我想回到

PERSON_NO 
--------- 
3 
4 

感謝,再次。我沒有太多的SQL經驗,所以我不知道該怎麼做。

+2

這功課嗎?搜索'[關係部門]'或['sql-match-all'](http://stackoverflow.com/questions/tagged/sql-match-all) – 2012-02-20 02:34:01

+0

@ypercube今晚我甚至都沒有想到。我會把它刪除,直到我們發現... – 2012-02-20 02:34:45

+0

@邁克爾:我標記爲錯誤關閉。我認爲這與同一用戶的上一個問題相同。 – 2012-02-20 02:38:11

回答

1

您可以使用多個EXISTS()條款:

select a.PERSON_NO 
    from personTable a 
    where exists (select 1 from personTable where PERSON_NO = a.PERSON_NO 
       and CITY_NAME = 'City A') 
    and exists (select 1 from personTable where PERSON_NO = a.PERSON_NO 
       and CITY_NAME = 'City B') 
    and exists (select 1 from personTable where PERSON_NO = a.PERSON_NO 
       and CITY_NAME = 'City C') 
2

另一種方法是剛剛加入該表本身幾十倍。

SELECT DISTINCT Person_No FROM mytable 
INNER JOIN mytable mt2 on (cityname='city b' and mt1.person_no=mt2.person_no) 
INNER JOIN mytable mt3 on (cityname='city c' and mt1.person_no=mt3.person_no) 
WHERE cityName='city a' 

當第一次學習SQL時,大多數學生都沒有意識到在查詢中多次包含同一個表是完全合法的。有很多問題可以通過這種方式解決。

+1

+1使用連接和所涉及的課程。確實,新SQL用戶經常將它的from子句中的表視爲「特殊」,直到加入它,並且忘記它可以像其他任何方式一樣重新加入:) – Jordan 2012-02-20 02:45:21

3

如果你在SQL Server 2000或更高版本,你可以使用INTERSECT:

select PERSON_NO from table1 where CITY_NAME='City A' 
intersect 
select PERSON_NO from table1 where CITY_NAME='City B' 
intersect 
select PERSON_NO from table1 where CITY_NAME='City C' 
0

我會繼續聚集和HAVING做到這一點。假設沒有重複:

SELECT person_no, count(*) 
    FROM mytable 
    WHERE city_name IN ('City A', 'City B', 'City C') 
    GROUP BY person_no 
HAVING count(*) = 3 

這樣做的好處是隻能打一次表,連接可能不會。

-1

試試這個

SELECT PERSON_NO 
FROM  YOURTABLENAME 
WHERE CITY_NAME = 'City A' 
     AND CITY_NAME = 'City B' 
     AND CITY_NAME = 'City C' 
+0

-1沒有_single_ CITY_NAME可以等於同時有多個值,所以這將永遠不會返回任何行。 – 2012-02-20 03:11:55

+0

嗯好吧我對此也很陌生..以爲這是可能的......謝謝你的澄清 – MonteCristo 2012-02-20 21:06:52

0

沒有實際測試,但是,這個總體思路應該工作:

SELECT DISTINCT PERSON_ID 
FROM YOUR_TABLE T1 
WHERE 
    NOT EXISTS (
     SELECT CITY_NAME -- All cities. 
     FROM YOUR_TABLE T2 
     EXCEPT -- Or may be "MINUS", depending on your DBMS. 
     SELECT CITY_NAME -- Cities the user worked in. 
     FROM YOUR_TABLE T3 
     WHERE T1.PERSON_NO = T3.PERSON_NO 
    ) 

用簡單的英語:

  • 對於每一個不同的人,找到set difference所有城市她在工作過的城市。
  • 如果這種差異是空的,那麼這個人就在所有城市工作過。
+0

奇怪的是,我似乎是迄今唯一提出的一般答案。如果在表中添加/修改/刪除城市,所有其他答案都需要修改SQL文本。 – 2012-02-20 03:08:12