在主查询的“IN”子句中使用逗号分隔列表的子查询结果

Posted

技术标签:

【中文标题】在主查询的“IN”子句中使用逗号分隔列表的子查询结果【英文标题】:use result from subquery with comma separated list in "IN" clausule of main query 【发布时间】:2018-02-13 18:10:48 【问题描述】:

我有 2 张桌子: - 一个(用户)在名为 login 的列中包含每个用户的首字母 - 另一个(任务计划的)在名为 userId 的列中包含相同的首字母。 我需要从匹配条件“技术员”的“用户”表中选择所有用户,然后我需要从与这些用户匹配的任务计划中选择所有任务。

我已经构建了以下查询:

SELECT
tp.*
FROM
taskplanned tp
WHERE
tp.userId IN (
    SELECT
        (
            GROUP_CONCAT(CONCAT('''', login, ''''))
        )
    FROM
        users u
    WHERE
        u.cis_role LIKE '%technician%'
)

当独立运行子查询时,它会显示: 'BDG','FG','BJ','WDG','NDW','TV','SA','JV','GW','MU','KD','LV','KL ','TDW','DK','KDS','PD','WB'

所以,我假设在主查询的“IN”子句中插入这部分时,它应该可以工作。不幸的是,它不是。我在这里遗漏了什么吗?

如果我从子查询中获取结果并将其手动添加到主查询中,它就像一个魅力..

【问题讨论】:

【参考方案1】:

GROUP_CONCAT() 不是必需的。就这样做吧:

SELECT
tp.*
FROM
taskplanned tp
WHERE
tp.userId IN (
    SELECT
        login
    FROM
        users u
    WHERE
        u.cis_role LIKE '%technician%'
)

当这是一对一的关系时,更好的方法是加入:

SELECT
tp.*
FROM
taskplanned tp
JOIN users u ON tp.userId = u.login
WHERE u.cis_role LIKE '%technician%'

【讨论】:

【参考方案2】:

mysql SELECT * FROM taskplanned WHERE userId IN ( SELECT login FROM users WHERE cis_role LIKE '%technician%')

你不需要组连接..

【讨论】:

以上是关于在主查询的“IN”子句中使用逗号分隔列表的子查询结果的主要内容,如果未能解决你的问题,请参考以下文章

SQL IN 逗号分隔参数与内部查询

安全地为查询准备逗号分隔列表[重复]

MySQL“IN”子句中的逗号分隔值

如何对查询中的字段进行编程,以在该记录的子数据表中显示逗号分隔的唯一值列表?

如何在选择语句的“NOT IN”子句中使用逗号分隔的字符串列表作为 pl/sql 存储的函数参数

SQL IN 子句仅返回以逗号分隔的 ID 列表中具有第一个匹配项的行