我正在尝试从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。