2012-02-20 121 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