Oracle 如何避免获取缺少表达式的错误
我遇到了类似这样的错误Oracle 如何避免获取缺少表达式的错误,oracle,plsql,Oracle,Plsql,我遇到了类似这样的错误 ORA-00936: missing expression SELECT * FROM( SELECT DISTINCT ata.ATAID AS ataId, ata.AtaNumber AS ataNumber, ata.Name AS ataName, ata.Start
ORA-00936: missing expression
SELECT * FROM(
SELECT DISTINCT
ata.ATAID AS ataId,
ata.AtaNumber AS ataNumber,
ata.Name AS ataName,
ata.StartDate,
ata.DueDate as EndDate,
ata.financeId,
ata.PaymentType,
NULL AS lastAtaId
FROM
ata
INNER JOIN
weekly_report wr
ON
wr.ataId = ata.ATAID
INNER JOIN
ata_articles aa
ON
aa.wrId = wr.id
WHERE
ata.Ata = 1
AND
ata.Type = 1
AND
((wr.status = 2 OR wr.status = 5) OR
((SELECT a.PaymentType FROM ata a WHERE a.ParentAta = ata.ATAID ORDER BY a.AtaNumber DESC) = 2 AND ata.Status = 2))
AND
ata.ProjectID = 137
AND
( ata.PaymentType = 1 OR ata.PaymentType = 4)
UNION
SELECT DISTINCT
ata.ATAID AS ataId,
ata.AtaNumber AS ataNumber,
ata.Name AS ataName,
ata.StartDate,
ata.DueDate as EndDate,
ata.financeId,
ata.PaymentType,
(SELECT a.ATAID FROM ata a WHERE a.ParentAta = ata.ATAID ORDER BY a.AtaNumber DESC) AS lastAtaId
FROM
ata
LEFT JOIN invoice_articles ia
ON ata.ATAID=ia.AtaId
WHERE
Ata = 1
AND
Type = 1
AND
( PaymentType = 2 OR PaymentType = 3 )
AND
(Status = 2 OR Status = 5)
AND
ProjectID = 137
UNION
SELECT DISTINCT
ata.ATAID AS ataId,
ata.AtaNumber AS ataNumber,
ata.Name AS ataName,
ata.StartDate,
ata.DueDate as EndDate,
ata.financeId,
ata.PaymentType,
null AS lastAtaId
FROM
ata
LEFT JOIN invoice_articles ia
ON ata.ATAID=ia.AtaId
WHERE
Ata = 1
AND
Type = 1
AND
becomeFastFromOtherType = 1
AND
(Status = 2 OR Status = 5)
AND
ProjectID = 137) a
GROUP BY a.ataId
ORDER BY CAST(a.ataNumber AS SIGNED)
在我运行这个查询时,我得到了一点,即错误出现在这行代码中(第一个选择)
我分别测试了三个SELECT语句,如下所示
SELECT DISTINCT
ata.ATAID AS ataId,
ata.AtaNumber AS ataNumber,
ata.Name AS ataName,
ata.StartDate,
ata.DueDate as EndDate,
ata.financeId,
ata.PaymentType,
NULL AS lastAtaId
FROM
ata
INNER JOIN
weekly_report wr
ON
wr.ataId = ata.ATAID
INNER JOIN
ata_articles aa
ON
aa.wrId = wr.id
WHERE
ata.Ata = 1
AND
ata.Type = 1
AND
(wr.status = 2 OR wr.status = 5)
/*OR
((SELECT a.PaymentType FROM ata a WHERE a.ParentAta = ata.ATAID ORDER BY a.AtaNumber DESC) = 2 AND ata.Status = 2))*/
AND
ata.ProjectID = 137
AND
( ata.PaymentType = 1 OR ata.PaymentType = 4)
然后选择statment
SELECT DISTINCT
ata.ATAID AS ataId,
ata.AtaNumber AS ataNumber,
ata.Name AS ataName,
ata.StartDate,
ata.DueDate as EndDate,
ata.financeId,
ata.PaymentType
--(SELECT a.ATAID FROM ata a WHERE a.ParentAta = ata.ATAID ORDER BY a.AtaNumber DESC) AS lastAtaId
FROM
ata
LEFT JOIN invoice_articles ia
ON ata.ATAID=ia.AtaId
WHERE
Ata = 1
AND
Type = 1
AND
( PaymentType = 2 OR PaymentType = 3 )
AND
(Status = 2 OR Status = 5)
AND
ProjectID = 137
SELECT DISTINCT
ata.ATAID AS ataId,
ata.AtaNumber AS ataNumber,
ata.Name AS ataName,
ata.StartDate,
ata.DueDate as EndDate,
ata.financeId,
ata.PaymentType,
null AS lastAtaId
FROM
ata
LEFT JOIN invoice_articles ia
ON ata.ATAID=ia.AtaId
WHERE
Ata = 1
AND
Type = 1
AND
becomeFastFromOtherType = 1
AND
(Status = 2 OR Status = 5)
AND
ProjectID = 137
-- GROUP BY a.ataId
-- ORDER BY CAST(a.ataNumber AS SIGNED)
和第三个选择站
SELECT DISTINCT
ata.ATAID AS ataId,
ata.AtaNumber AS ataNumber,
ata.Name AS ataName,
ata.StartDate,
ata.DueDate as EndDate,
ata.financeId,
ata.PaymentType
--(SELECT a.ATAID FROM ata a WHERE a.ParentAta = ata.ATAID ORDER BY a.AtaNumber DESC) AS lastAtaId
FROM
ata
LEFT JOIN invoice_articles ia
ON ata.ATAID=ia.AtaId
WHERE
Ata = 1
AND
Type = 1
AND
( PaymentType = 2 OR PaymentType = 3 )
AND
(Status = 2 OR Status = 5)
AND
ProjectID = 137
SELECT DISTINCT
ata.ATAID AS ataId,
ata.AtaNumber AS ataNumber,
ata.Name AS ataName,
ata.StartDate,
ata.DueDate as EndDate,
ata.financeId,
ata.PaymentType,
null AS lastAtaId
FROM
ata
LEFT JOIN invoice_articles ia
ON ata.ATAID=ia.AtaId
WHERE
Ata = 1
AND
Type = 1
AND
becomeFastFromOtherType = 1
AND
(Status = 2 OR Status = 5)
AND
ProjectID = 137
-- GROUP BY a.ataId
-- ORDER BY CAST(a.ataNumber AS SIGNED)
注释的所有代码行表示这行代码抛出错误消息。
我看了几分钟的一个错误,但我不明白是什么错了?为什么在所有子查询表达式中出现错误?
(SELECT a.PaymentType FROM ata a WHERE a.ParentAta = ata.ATAID ORDER BY a.AtaNumber DESC) = 2
删除orderby
子句
(SELECT a.PaymentType FROM ata a WHERE a.ParentAta = ata.ATAID) = 2
子查询应返回最大一行(否则会出现运行时错误),因此,
ORDER BY
子句不是必需的,而且显然在语法上也不受支持检查查询returs的记录数从ata a中选择a.ATAID,其中a.ParentAta=ata.ATAID ORDER BY a.AtaNumber DESC
无返回。ORA-00904:“ATA”。“ATAID”:无效标识符,很可能此选择需要重写