SQL:如何在所有值都必须存在的数组上进行连接?
我有一张人员可用性表:SQL:如何在所有值都必须存在的数组上进行连接?,sql,Sql,我有一张人员可用性表: +---+---+---+---+---+---+ | M | T | W | F | S | S | +---+---+---+---+---+---+ Olivier | | | | | X | X | +---+---+---+---+---+---+ Georges | X | | | X | | | +---+---+---+---+--
+---+---+---+---+---+---+
| M | T | W | F | S | S |
+---+---+---+---+---+---+
Olivier | | | | | X | X |
+---+---+---+---+---+---+
Georges | X | | | X | | |
+---+---+---+---+---+---+
所以我有三张桌子:
- 可用性
- 人
- 人员可用性
SELECT p.*
FROM person p
JOIN person_availability pa
ON p.id=pa.person_id
JOIN availability a
ON a.id=pa.availability_id
WHERE p.id = ?
AND a.day in (?)
具有动态参数。示例:param1=1
和param2=(1,4,5)
问题是,此查询返回在其中一个可用性中可用的人员行。如何在所有可用性(1,4,5)
?我建议:
将param2放入具有以下结构的临时表:
DECLARE @Days TABLE
(
Day INT
)
(在表中插入天数)
那么您的查询可以是:
SELECT P.*
FROM person P
CROSS JOIN @Days D
-- Only include people where all the days are in their available days
WHERE D.Day IN
(
SELECT A.Day
FROM availability A
JOIN person_availability PA ON A.availability_id = PA.availability_id
JOIN person P1 ON P1.person_id = PA.person_id
WHERE P1.person_id = P.person_id
)
AND P.person_id = PARAM1
您按p.id对
进行分组,然后将其与进行匹配,使COUNT(a.day)
等于IN(?)
中的值数。通过这种方式,您可以确保为IN子句中的每个人获取值,如果您提供3个值,并且计数返回3,则您知道该人具有所有可用性
像这样:
SELECT p.*
FROM person p
JOIN person_availability pa ON p.id = pa.person_id
JOIN availability a ON a.id = pa.availability_id
WHERE p.id = 1 AND a.day IN (1,2,3)
GROUP BY p.id
HAVING COUNT(a.day) = 3;
<代码>有计数(*)=@ NoMyByof天/<代码>的组。我已经按照ID/Cuth>(我的SQL比这里要求的例子要复杂得多)来做一个关于您可能要考虑的备选设计的阅读。