簡體   English   中英

如何在SQL查詢中消除具有最大ID的行?

[英]How to eliminate a row which having the maximum ID in sql query?

我需要從SQL查詢中消除具有最大ID的最后一行,該怎么辦? 我嘗試以下查詢。但是它沒有生成記錄

SELECT a.DocEntry, a.Project, a.DocTotal, a.U_Installement
FROM OPCH AS a
LEFT JOIN PCH1 AS b
    ON b.DocEntry = a.DocEntry
LEFT JOIN OPOR AS c
    ON c.DocEntry = b.BaseEntry
    AND a.Project = c.Project
WHERE a.CANCELED = 'N'
AND a.Project = c.Project
GROUP BY a.DocEntry, a.Project, a.DocTotal, a.U_Installement
HAVING MAX(a.DocEntry) <> a.DocEntry;

看起來像這樣工作:

SELECT a.DocEntry, a.Project, a.DocTotal, a.U_Installement
FROM OPCH AS a
  JOIN PCH1 AS b
    ON b.DocEntry = a.DocEntry
  JOIN OPOR AS c
    ON c.DocEntry = b.BaseEntry
    AND a.Project = c.Project
WHERE a.CANCELED = 'N'
    AND a.DocEntry NOT IN (SELECT MAX(DocEntry) FROM OPCH)

在我看來,您想消除每個組的最大ID,因此我使用了row_number()

    with cte as
    (

    SELECT a.DocEntry, a.Project, a.DocTotal, a.U_Installement,
     row_number()over(partitioned by a.Project, a.DocTotal, a.U_Installement
      ordere by a.DocEntry desc) rn
    FROM OPCH AS a
    JOIN PCH1 AS b
        ON b.DocEntry = a.DocEntry
     JOIN OPOR AS c
        ON c.DocEntry = b.BaseEntry
        AND a.Project = c.Project
    WHERE a.CANCELED = 'N'

 ) select * from cte where rn<>1

首先,學習使用有意義的表別名而不是任意字母。 這使查詢更容易閱讀。

其次,您的WHERE子句將外部聯接轉換為內部聯接。

然后,您將刪除重復項-但這些重復項可能是由JOIN生成的。 這可以通過使用EXISTS來解決。

因此,對於您的完整查詢:

SELECT o.DocEntry, o.Project, o.DocTotal, o.U_Installement
FROM OPCH o
WHERE o.CANCELED = 'N' AND
      EXISTS (SELECT 1
              FROM PCH1 p JOIN
                   OPOR op
                   ON op.DocEntry = p.BaseEntry
              WHERE p.DocEntry = o.DocEntry AND
                    op.Project = o.Project
             );

然后,您可以將窗口函數合並到其中:

SELECT DocEntry, Project, DocTotal, U_Installement
FROM (SELECT o.DocEntry, o.Project, o.DocTotal, o.U_Installement,
             MAX(o.DocEntry) OVER () as max_DocEntry
      FROM OPCH o
      WHERE o.CANCELED = 'N' AND
            EXISTS (SELECT 1
                    FROM PCH1 p JOIN
                         OPOR op
                         ON op.DocEntry = p.BaseEntry
                    WHERE p.DocEntry = o.DocEntry AND
                          op.Project = o.Project
                   )
     ) o
WHERE docEntry < max_docEntry;

我們定期使用此方法:

select a.* from ( 
    SELECT a.DocEntry, a.Project, a.DocTotal, a.U_Installement
    FROM OPCH a 
    GROUP BY a.DocEntry, a.Project, a.DocTotal, a.U_Installement
    HAVING MAX(a.DocEntry) <> a.DocEntry 
) AS a 
LEFT JOIN PCH1 AS b
    ON b.DocEntry = a.DocEntry
LEFT JOIN OPOR AS c
    ON c.DocEntry = b.BaseEntry
    AND a.Project = c.Project
WHERE a.CANCELED = 'N'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM