返回表中包含两个值的行

时间:2015-11-19 17:20:56

标签: sql sql-server sql-server-2008

我觉得我正在服用疯狂的药片。

我有一张名为problems的表格。它看起来像:

id  | pid |  problem_list_id
-----------------------------------
1   | 159 | 16
2   | 159 | 4
3   | 10  | 16
4   | 565 | 90
5   | 565 | 4
6   | 122 | 12

我想查询问题_id为16和4的pid

SELECT
    YEAR(pbd.date_created), 
    COUNT(*)
FROM
    patient_booking_data pbd inner join problems p on pbd.pid = p.pid
WHERE p.problem_list_id in (16,4)
GROUP BY YEAR(pbd.date_created)
ORDER BY YEAR(pbd.date_created)

这显然会达到16或4.我需要16和4的pid。

当我尝试使用时:

WHERE (p.problem_list_id = 16 AND p.problem_list_id = 4)

这不会产生任何结果。

我可以使用类似的东西:

SELECT
    YEAR(pbd.date_created), 
    COUNT(*)
FROM
    patient_booking_data pbd inner join problems p on pbd.pid = p.pid
WHERE p.problem_list_id = 16
      AND pbd.pid in (SELECT pid FROM problems where problem_list_id = 4)
GROUP BY YEAR(pbd.date_created)
ORDER BY YEAR(pbd.date_created)

但是使用嵌套的select似乎有点矫枉过正。

我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:2)

我不确定为什么您的查询与数据表不同?

但是使用您的数据表,您可以使用SELECT pid FROM problems WHERE problem_list_id in (16,4) GROUP BY pid HAVING COUNT(DISTINCT problem_list_id) = 2

16 or 2

我使用不同的情况,如果pid可能会出现COUNT(*)多次出现,否则只有patient_booking就足够了

也许你需要这样的东西。使用cte首先计算pid,然后返回WITH cte as ( SELECT pid FROM problems WHERE problem_list_id in (16,4) GROUP BY pid HAVING COUNT(DISTINCT problem_list_id) = 2 ) SELECT YEAR(pbd.date_created), COUNT(*) FROM patient_booking_data pbd JOIN CTE c on pbd.pid = c.pid GROUP BY YEAR(pbd.date_created) ORDER BY YEAR(pbd.date_created)

onActivityResult()