SQL子查询返回的值超过1。子查询时不允许这样做

时间:2016-04-11 17:32:12

标签: sql sql-server

我有这个问题:

SELECT * 
FROM Schedule_OverdueTasks 
WHERE Job_No LIKE (
    SELECT DISTINCT AREA_ID 
    FROM V_CONSTAT_PROJ_DATES 
    WHERE AREA_DESC IN ('aaa', 'bbb') + '%'

但这给了我这个错误:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

当我像这样运行查询时,我没有错误,因为只有1 AREA_I

SELECT * 
FROM Schedule_OverdueTasks 
WHERE Job_No LIKE (
    SELECT DISTINCT AREA_ID 
    FROM V_CONSTAT_PROJ_DATES 
    WHERE AREA_DESC = 'aaa') + '%'

我尝试过重做我的查询:

SELECT * 
FROM Schedule_OverdueTasks 
INNER JOIN V_CONSTAT_PROJ_DATES 
    ON V_CONSTAT_PROJ_DATES.JOB_NUMBER = Schedule_OverdueTasks.Job_No 
WHERE V_CONSTAT_PROJ_DATES.AREA_DESC IN ('aaa', 'bbb')

但我没有得到相同数量的结果。我做错了什么?

4 个答案:

答案 0 :(得分:2)

我无法发表评论,因此我需要使用答案部分,但like需要scalar data type而非“表值数据类型

意味着您只能将其与1个值进行比较

因此,如果不知道您的数据结构,我现在能够推荐的最好的是

    SELECT *
FROM Schedule_OverdueTasks
INNER JOIN (
    SELECT DISTINCT AREA_ID
    FROM V_CONSTAT_PROJ_DATES
    WHERE AREA_DESC = 'aaa'
    ) vcpd ON Job_No LIKE Area_ID + '%'

编辑: 正如Per Gordons的回答一样,虽然优化器可能会将此解释为存在但更好地写出你的意思,但是存在对于性能而言并不会改变结果集是理想的。

答案 1 :(得分:2)

我建议你使用exists

SELECT ot.*
FROM Schedule_OverdueTasks ot
WHERE EXISTS (SELECT 1 
              FROM V_CONSTAT_PROJ_DATES pd
              WHERE ot.Job_No LIKE pd.area_id + '%' AND
                    AREA_DESC IN ('aaa', 'bbb')
             );

答案 2 :(得分:0)

根据您的查询,看起来Job_No的末尾有其他字符,AREA_ID将是Job_No的前几个字符。如果AREA_ID是一个设定的长度(比如5个字符),你可以尝试这个

SELECT * FROM Schedule_OverdueTasks 
INNER JOIN V_CONSTAT_PROJ_DATES ON LEFT(Schedule_OverdueTasks.Job_No, 5) = V_CONSTAT_PROJ_DATES.AREA_ID 
WHERE V_CONSTAT_PROJ_DATES.AREA_DESC IN ('aaa', 'bbb')

答案 3 :(得分:0)

LIKE运算符中的结果集必须返回一个且只返回一条记录,因为LIKE运算符将被计算为返回true或false。

使用TOP 1来避免错误。

此查询不会失败,但是为了获得正确的结果,这是另一回事。您必须修改数据和条件。

SELECT * 
FROM Schedule_OverdueTasks 
WHERE Job_No LIKE (SELECT TOP 1 AREA_ID 
                   FROM V_CONSTAT_PROJ_DATES 
                   WHERE AREA_DESC IN ('aaa', 'bbb') + '%'

要测试LIKE的行为,请运行以下查询,并生成相同的错误消息。

SELECT  foo
FROM    ( SELECT    1 foo
          UNION ALL
          SELECT    1 foo
        ) bar
WHERE   1 LIKE ( SELECT 1 foo
                 UNION ALL
                 SELECT 2 foo
               );