我正在尝试从SQL Server 2008中的查询获取一些记录。
桌子的存放方式是这样的

P_Id        Activity_Id
-----------------------
1234        53
1234        510
4567        65
4567        510
3456        53
3456        540
5678        53
5678        510

现在我需要得到的是哪一个P悻ID预订了活动53&510或65&510
如果我做这样的事,它不会给我任何记录
SELECT  P_Id FROM ActivitiesPerPerson WHERE Activity_Id = 53 AND Activity_Id = 510

如果我这样做
SELECT  P_Id FROM ActivitiesPerPerson WHERE Activity_Id IN (53, 65, 510)

它给了我一些结果,但它给了我的人预订活动53只与其他一起。
我需要把53和510一起登记的人的身份证和65和510一起登记的人的身份证。如果可能的话,所有的结果都是一样的。
我有一个SQL处理这个
http://sqlfiddle.com/#!3/b4c11/2
提前谢谢

最佳答案

您将扫描表一次,然后按p_id分组。完成此操作后,您需要一个聚合来告诉您是否有该p_id的activity_id x。您可以简单地用case子句求和。那就只拿那些符合你条件的证件:

SELECT P_Id
FROM ActivitiesPerPerson
WHERE Activity_Id IN (53, 65, 510)
GROUP BY p_Id
HAVING
(
  SUM( CASE WHEN Activity_Id = 53 THEN 1 ELSE 0 END ) > 0
  AND
  SUM( CASE WHEN Activity_Id = 510 THEN 1 ELSE 0 END ) > 0
)
OR
(
  SUM( CASE WHEN Activity_Id = 65 THEN 1 ELSE 0 END ) > 0
  AND
  SUM( CASE WHEN Activity_Id = 510 THEN 1 ELSE 0 END ) > 0
);

http://sqlfiddle.com/#!3/b4c11/38

10-01 12:13