SQL可以在嵌套的SELECT中的WHERE中使用用例吗?
我正在尝试将某些记录放入第二个查询的子集中。我一直得到的错误是:多次使用表别名:Eqanswer-SQL语句中的错误位置是:199行:3列:22这只是最后一条消息,我缺少解决它的明显答案,但我真的想知道这是否有效SQL可以在嵌套的SELECT中的WHERE中使用用例吗?,sql,case,Sql,Case,我正在尝试将某些记录放入第二个查询的子集中。我一直得到的错误是:多次使用表别名:Eqanswer-SQL语句中的错误位置是:199行:3列:22这只是最后一条消息,我缺少解决它的明显答案,但我真的想知道这是否有效 SELECT e.entityid, e.entitynum, e.entityrole, eq.memotext, eq.fieldnum FROM ( SELECT DISTINCT entitynum
SELECT
e.entityid, e.entitynum, e.entityrole, eq.memotext, eq.fieldnum
FROM
( SELECT
DISTINCT entitynum
FROM Eqanswer, entities
LEFT JOIN Eqanswer
ON (Eqanswer.entitynum = entities.entitynum)
WHERE
entities.partyID LIKE
CASE
WHEN (entities.partyID LIKE '%Joe%'
OR entities.partyID LIKE '%Bob%'
OR entities.partyID LIKE '%Bill%')
THEN
(eqanswer.entityrole = 'F_TL'
AND (CONVERT(eqanswer.memotext, sql_date)=curDate() -5 ))
ELSE
(eqanswer.entityrole = 'F_TL' AND eqanswer.fieldnum = 160
AND (CONVERT(eqanswer.memotext,sql_date) = CurDate() -1 ))
END
) AS bs
LEFT JOIN Entities e ON (bs.entitynum = e.entitynum)
LEFT JOIN Eqanswer eq ON (bs.entitynum = eq.entitynum)
WHERE((eq.entityrole = 'R_CKLIST' AND eq.fieldnum in (8,9,10,11,34,35))
OR (eq.entityrole = 'F_TL' AND eq.fieldnum in (104,112,158,160))
OR (eq.entityrole = 'C_REVIEW' AND eq.fieldnum = 69))
ORDER BY e.entitynum
我尝试了以下两种方法:
SELECT
e.entityid, e.entitynum, e.entityrole, eq.memotext, eq.fieldnum
FROM ( SELECT
DISTINCT entitynum
FROM Eqanswer, entities
LEFT JOIN Eqanswer
ON (Eqanswer.entitynum = entities.entitynum)
WHERE
entities.partyID
CASE
WHEN (entities.partyID LIKE '%Joe%'
OR entities.partyID LIKE '%Bob%'
OR entities.partyID LIKE '%Bill%')
THEN
(eqanswer.entityrole = 'F_TL'
AND eqanswer.fieldnum = 160
AND (CONVERT(eqanswer.memotext, sql_date)=curDate() -5 ))
ELSE
(eqanswer.entityrole = 'F_TL' AND eqanswer.fieldnum = 160
AND (CONVERT(eqanswer.memotext,sql_date) = CurDate() -1 ))
END
) AS bs
LEFT JOIN Entities e ON (bs.entitynum = e.entitynum)
LEFT JOIN Eqanswer eq ON (bs.entitynum = eq.entitynum)
WHERE((eq.entityrole = 'R_CKLIST' AND eq.fieldnum in (8,9,10,11,34,35))
OR (eq.entityrole = 'F_TL' AND eq.fieldnum in (104,112,158,160))
OR (eq.entityrole = 'C_REVIEW' AND eq.fieldnum = 69))
ORDER BY e.entitynum
及
两者都是抛出错误,但这就像是语法错误,我的错 你真的有两次Eqanswer:
编辑
好的,这个子选择在很多地方都是错误的:我将把我的注释添加为字符串,而不是注释,以使它们更加突出
SELECT entitynum
FROM Eqanswer, entities
LEFT JOIN Eqanswer 'this is the duplicate table name'
ON (Eqanswer.entitynum = entities.entitynum)
WHERE entities.partyID LIKE
'LIKE implies that partyID AND the CASE expression are both strings'
CASE
WHEN (entities.partyID LIKE '%Joe%'
OR entities.partyID LIKE '%Bob%'
OR entities.partyID LIKE '%Bill%')
THEN (eqanswer.entityrole = 'F_TL'
AND (CONVERT(eqanswer.memotext, sql_date)=curDate() -5 ))
'but THIS is a boolean expression'
ELSE (eqanswer.entityrole = 'F_TL'
AND eqanswer.fieldnum = 160
AND (CONVERT(eqanswer.memotext,sql_date) = CurDate() -1 ))
'and THIS too'
END
) AS bs
因此,LIKE对数据类型未知的列进行操作,而CASE则生成布尔表达式。最有可能的是,line entities.partyID LIKE只是一个复制粘贴错误。让我们忽略它吧
不能将布尔表达式作为CASE子句的结果返回。因此,您需要重写CASE以返回一个整数,并比较该值以匹配预期的WHERE条件
可能是这样的:
WHERE
CASE
WHEN (entities.partyID LIKE '%Joe%'
OR entities.partyID LIKE '%Bob%'
OR entities.partyID LIKE '%Bill%')
THEN
CASE WHEN (eqanswer.entityrole = 'F_TL'
AND (CONVERT(eqanswer.memotext, sql_date)=curDate() -5 ))
THEN 1 ELSE 0 END
ELSE
CASE WHEN (eqanswer.entityrole = 'F_TL'
AND eqanswer.fieldnum = 160
AND (CONVERT(eqanswer.memotext,sql_date) = CurDate() -1 ))
THEN 1 ELSE 0 END
END = 1
您确实拥有Eqanswer两次:
编辑
好的,这个子选择在很多地方都是错误的:我将把我的注释添加为字符串,而不是注释,以使它们更加突出
SELECT entitynum
FROM Eqanswer, entities
LEFT JOIN Eqanswer 'this is the duplicate table name'
ON (Eqanswer.entitynum = entities.entitynum)
WHERE entities.partyID LIKE
'LIKE implies that partyID AND the CASE expression are both strings'
CASE
WHEN (entities.partyID LIKE '%Joe%'
OR entities.partyID LIKE '%Bob%'
OR entities.partyID LIKE '%Bill%')
THEN (eqanswer.entityrole = 'F_TL'
AND (CONVERT(eqanswer.memotext, sql_date)=curDate() -5 ))
'but THIS is a boolean expression'
ELSE (eqanswer.entityrole = 'F_TL'
AND eqanswer.fieldnum = 160
AND (CONVERT(eqanswer.memotext,sql_date) = CurDate() -1 ))
'and THIS too'
END
) AS bs
因此,LIKE对数据类型未知的列进行操作,而CASE则生成布尔表达式。最有可能的是,line entities.partyID LIKE只是一个复制粘贴错误。让我们忽略它吧
不能将布尔表达式作为CASE子句的结果返回。因此,您需要重写CASE以返回一个整数,并比较该值以匹配预期的WHERE条件
可能是这样的:
WHERE
CASE
WHEN (entities.partyID LIKE '%Joe%'
OR entities.partyID LIKE '%Bob%'
OR entities.partyID LIKE '%Bill%')
THEN
CASE WHEN (eqanswer.entityrole = 'F_TL'
AND (CONVERT(eqanswer.memotext, sql_date)=curDate() -5 ))
THEN 1 ELSE 0 END
ELSE
CASE WHEN (eqanswer.entityrole = 'F_TL'
AND eqanswer.fieldnum = 160
AND (CONVERT(eqanswer.memotext,sql_date) = CurDate() -1 ))
THEN 1 ELSE 0 END
END = 1
CASE是一个表达式,返回一个标量值。假设是SQL Server,它既不能返回谓词也不能返回布尔值,因为没有布尔类型。您使用的是什么样的SQL?我使用SQL从.Net、无Express、tSQL或Server查询Advantage DB。仅用于查询DB.CASE的语言是一个表达式并返回标量值。假设是SQL Server,它既不能返回谓词也不能返回布尔值,因为没有布尔类型。您使用的是什么样的SQL?我使用SQL从.Net、无Express、tSQL或Server查询Advantage DB。只需要查询DB的语言。修复了多个Eqanswer,但它不喜欢WHERE子句后面的like语句。我不需要WHERE后面的CASE entities.partyID中使用的字段吗?当我尝试以下操作时,代码检查没有任何错误,但是我仍然没有运行它。CASE 1作为CASE语句中的lead。修复了多个Eqanswer,但它不喜欢WHERE子句后面的like语句。我不需要在CASE entities中使用字段。partyID在WHERE之后?当我尝试以下操作时,我在代码检查中没有发现任何错误,但是我仍然没有让它运行。CASE 1作为CASE语句的前导。我喜欢这段代码,但它抛出了以下错误:运算符的操作数无效:like-SQL语句中的错误位置是:279 line:5 column:26 remove like,我想您不需要它,直到不喜欢这个案例。在CASE语句周围出现错误。错误:未找到预期的词法元素:在SELECT语句的FROM关键字之后解析表名时出现问题。-SQL语句中的错误位置是:279行:5列:10好的,我为您创建了一个SQL FIDLE示例-我喜欢这段代码,但它引发了以下错误:运算符的操作数无效:like-SQL语句中的错误位置是:279行:5列:26删除like,我认为您不需要它,直到不喜欢这种情况。在CASE语句周围出现错误。错误:未找到预期的词法元素:在SELECT语句的FROM关键字之后解析表名时出现问题。-SQL语句中的错误位置是:279行:5列:10好的,我已经为您创建了一个SQL FIDLE示例-
SELECT
e.entityid, e.entitynum, e.entityrole, eq.memotext, eq.fieldnum
FROM
( SELECT
DISTINCT entitynum
/* THIS NEEDS TO BE CHANGED {Eqanswer} used 2 times without any alias */
FROM Eqanswer, entities
LEFT JOIN Eqanswer
ON (Eqanswer.entitynum = entities.entitynum)
WHERE
entities.partyID LIKE /* why you need this ?? */
CASE
WHEN (entities.partyID LIKE '%Joe%'
OR entities.partyID LIKE '%Bob%'
OR entities.partyID LIKE '%Bill%')
THEN
(eqanswer.entityrole = 'F_TL'
AND (CONVERT(eqanswer.memotext, sql_date)=curDate() -5 ))
ELSE
(eqanswer.entityrole = 'F_TL' AND eqanswer.fieldnum = 160
AND (CONVERT(eqanswer.memotext,sql_date) = CurDate() -1 ))
END
) AS bs
LEFT JOIN Entities e ON (bs.entitynum = e.entitynum)
LEFT JOIN Eqanswer eq ON (bs.entitynum = eq.entitynum)
WHERE((eq.entityrole = 'R_CKLIST' AND eq.fieldnum in (8,9,10,11,34,35))
OR (eq.entityrole = 'F_TL' AND eq.fieldnum in (104,112,158,160))
OR (eq.entityrole = 'C_REVIEW' AND eq.fieldnum = 69))
ORDER BY e.entitynum