下表列出了他们所在城市的人数和编号:
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经验,所以我不知道该怎么做。
答案 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
)
用简单的英语:
答案 5 :(得分:-1)
试试这个
SELECT PERSON_NO
FROM YOURTABLENAME
WHERE CITY_NAME = 'City A'
AND CITY_NAME = 'City B'
AND CITY_NAME = 'City C'