我有这个问题:
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')
但我没有得到相同数量的结果。我做错了什么?
答案 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
);