Sql 在多对多表中查询AND
我知道这是一个相对简单的问题,我就是想不出来。我有三个表格:Sql 在多对多表中查询AND,sql,sqlite,Sql,Sqlite,我知道这是一个相对简单的问题,我就是想不出来。我有三个表格:人员、演示文稿、和人员演示文稿人员和演示文稿都有ID列,并且人员_演示文稿都有外键指向人员和演示文稿 例如: 人民: ID | Name 1 | John 2 | Ian 3 | Mike 介绍: ID | Title 1 | A new hope 2 | The Empire Strikes Back 3 | Return of the Jedi people_ID | presentation_ID
人员
、演示文稿
、和人员演示文稿
<代码>人员和演示文稿
都有ID列,并且人员_演示文稿
都有外键指向人员
和演示文稿
例如:
人民:
ID | Name
1 | John
2 | Ian
3 | Mike
介绍:
ID | Title
1 | A new hope
2 | The Empire Strikes Back
3 | Return of the Jedi
people_ID | presentation_ID
1 | 1
2 | 1
2 | 2
1 | 3
3 | 3
人员介绍:
ID | Title
1 | A new hope
2 | The Empire Strikes Back
3 | Return of the Jedi
people_ID | presentation_ID
1 | 1
2 | 1
2 | 2
1 | 3
3 | 3
我正在尝试选择附加了特定人员子集的所有演示ID。对于
或s,这相对容易:从人员ID位于(1,2)中的人员演示中选择不同的演示ID代码>,但对于和的情况。。。我就是搞不懂。这需要为N个人工作,因此我不希望有无限的JOIN
s。您可以筛选表中需要的人,按演示分组,并在HAVING
子句中设置条件:
SELECT presentation_ID
FROM people_presentations
WHERE people_ID IN (1, 2)
GROUP BY presentation_ID
HAVING COUNT(*) = 2 -- the number of people
请参阅。一个有趣的方法是(错误地)使用LISTAGG:
WITH cteAttendees
AS (SELECT pp.PRESENTATION_ID,
',' || LISTAGG(pp.PEOPLE_ID, ',') WITHIN GROUP (ORDER BY pp.PEOPLE_ID) || ',' AS ATTENDEES
FROM PEOPLE_PRESENTATIONS pp
GROUP BY pp.PRESENTATION_ID)
SELECT *
FROM cteAttendees a
WHERE a.ATTENDEES LIKE '%,1,%' AND
a.ATTENDEES LIKE '%,2,%'
但是人员ID=1和人员ID=2。。。而people_ID=N
不会给你任何结果。我想你需要一个或,所以中的是个不错的选择solution@DonKnacki,同意这不会产生结果,这就是我有问题的原因。但是我需要这样一种情况,我只会得到第1人和第2人都附在一起的演示文稿。不过,这看起来已经在下面解决了。这似乎就是答案。非常感谢!我会在可能的时候接受答案。