如何调节变量以使其获取 IN 子句中的所有值 [重复]
Posted
技术标签:
【中文标题】如何调节变量以使其获取 IN 子句中的所有值 [重复]【英文标题】:How to condition a variable so that it takes all values within IN clause [duplicate] 【发布时间】:2017-11-15 21:35:54 【问题描述】:我很犹豫,也没有找到解决方案,所以我转向这里。 快速解释一下,假设我要过滤一个查询如下:
SELECT name FROM students WHERE courseCode IN (17, 18, 19);
在这里,我将获取参加课程 17 或 18 或 19的学生。
现在,您将如何获得注册这 3 门课程的学生?也就是在17和 18和 19?
当您知道“courseCode”值是什么时,可能会很简单,但是当您使用子查询获取这些值时,您会怎么做呢?
类似这样的:
SELECT name FROM students WHERE courseCode = 17 and courseCode = 18 and courseCode = 19;
当我知道值时(这是不正确的)
但是当我不知道它们是什么值时,我该怎么办?像这样:
SELECT name FROM students WHERE courseCode IN (SELECT courseCode FROM course WHERE ...);
希望你能解释清楚,谢谢你的帮助
【问题讨论】:
我相信你可以在这里使用ALL
条件。只需换掉 IN
并让它运行。 more info here
【参考方案1】:
这是一种可能的方法,使用 GROUP BY 折叠并获取不同课程代码的计数,并将其与文字进行比较:
SELECT s.name
FROM students s
WHERE s.courseCode IN (17,18,19)
GROUP BY s.name
HAVING COUNT(DISTINCT s.courseCode) = 3
(17,18,19)
可以替换为子查询。但我倾向于使用内联视图和连接操作。
SELECT s.name
FROM students s
JOIN ( SELECT 17 AS courseCode
UNION ALL SELECT 18
UNION ALL SELECT 19
) c
ON c.courseCode = s.courseCode
GROUP BY s.name
HAVING COUNT(DISTINCT s.courseCode) = 3
内联视图c
的查询只需要返回具有适当数据类型的名为courseCode
的列的不同值...很多可能的查询都可以工作...
JOIN ( SELECT foo AS courseCode
FROM bar
WHERE ...
GROUP BY foo
) c
这是一种方法的示例,还有其他方法......
【讨论】:
以上是关于如何调节变量以使其获取 IN 子句中的所有值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
用逗号替换分号,并在存储过程中的字符串的两端添加引号,以使其在IN子句中可搜索