簡體   English   中英

如何將 MS-SQL Server SELECT 查詢轉換/遷移到 Oracle 和 MySQL?

[英]How to Convert/Migrate MS-SQL Server SELECT Query To Oracle & MySQL?

在我們的產品中,我們正在擴展對 Oracle 和 MySQL 的支持,所以任何人都可以幫助遷移以下示例 SQL 查詢,該查詢在 MS-SQL Server 上運行良好,我已經嘗試過,但不知何故它不適用於 Oracle/MySQL,非常感謝任何幫助,並將自行轉換其余查詢,謝謝。

SELECT  A.SERVERID,A.DATAID 
                ,A.CREATETIMESTAMP AS 'Date Time'
                ,A.OBJECTINSTNAME
                ,A.PROJECTNAME 
                ,TEMP_IND_1.TEMP_ROW_NUM FROM DATALOG AS A WITH (NOLOCK) INNER JOIN
                ( 
                    SELECT      DATAID,ROW_NUMBER() OVER(ORDER BY CREATETIMESTAMP DESC) AS TEMP_ROW_NUM FROM    DATALOG WITH (NOLOCK)

            WHERE PROJECTNAME='ProjectA'
            ) AS TEMP_IND_1 ON A.DATAID = TEMP_IND_1.DATAID

         WHERE TEMP_IND_1.TEMP_ROW_NUM BETWEEN 1 AND 50;

您可以使用相同的查詢刪除WITH (NOLOCK)部分。 因為它們在 oracle 中沒有作用,而您在 oracle 中不需要它們。 並且列別名沒有as關鍵字給出,列別名必須是雙引號。 所以你的查詢變成這樣:

SELECT  A.SERVERID,A.DATAID 
                ,A.CREATETIMESTAMP  "Date Time"
                ,A.OBJECTINSTNAME
                ,A.PROJECTNAME 
                ,TEMP_IND_1.TEMP_ROW_NUM FROM DATALOG A INNER JOIN
                ( 
                    SELECT DATAID,
                           ROW_NUMBER() OVER(ORDER BY CREATETIMESTAMP DESC) TEMP_ROW_NUM 
                           FROM    DATALOG 
            WHERE PROJECTNAME='ProjectA'
            ) TEMP_IND_1 ON A.DATAID = TEMP_IND_1.DATAID
         WHERE TEMP_IND_1.TEMP_ROW_NUM BETWEEN 1 AND 50;

編輯:

對於 mysql,在不with (no lock)表達式執行原始查詢之前,您只需要更改會話以將隔離級別設置為read uncommited

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
 -- your query without no lock expressions
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ; -- set back to original isolation level

暫無
暫無

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

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