SQL:基于多个记录的查询

时间:2012-02-20 02:30:30

标签: 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

我如何能够获得居住在三个城市A,B和C的所有人的PERSON_NO?

我想返回

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

再次感谢。我没有那么多SQL经验,所以我不知道该怎么做。

6 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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时,大多数学生没有意识到在查询中多次包含同一个表是完全合法的。有很多问题可以通过这种方式解决。

答案 2 :(得分: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')

答案 3 :(得分: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

这样做的好处是只能敲击一次表,连接可能不会这样做。

答案 4 :(得分: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
  • 如果这个差异是空的,那么该人已经在所有城市工作过。

答案 5 :(得分:-1)

试试这个

SELECT   PERSON_NO 
FROM     YOURTABLENAME
WHERE    CITY_NAME =  'City A'
         AND  CITY_NAME = 'City B'
         AND  CITY_NAME = 'City C'
相关问题