Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:如何在所有值都必须存在的数组上进行连接?_Sql - Fatal编程技术网

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比这里要求的例子要复杂得多)来做一个关于您可能要考虑的备选设计的阅读。