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”:无效标识符,很可能此选择需要重写