2013-07-11 173 views
0

我想這個查詢從Oracle轉換到MySQL:轉換的Oracle查詢到MySQL查詢

CREATE TABLE SCT_201301_UMLS_SYN 
AS SELECT DISTINCT A.SCUI "SNOMED_CODE", A.STR "SNOMED_DISPLAY_NAME" 
    , B.STR "UMLS_SYNONYM" 
FROM MRCONSO A, MRCONSO_UMLS B 
WHERE A.SCUI IN (SELECT referencedComponentId 
       FROM SnomedCTtoICD10) 
AND A.SAB='SNOMEDCT' 
AND A.SUPPRESS='N' 
AND A.TTY='PT' 
AND B.LAT='ENG' 
AND B.SUPPRESS='N' 
AND A.CUI=B.CUI 

任何想法如何做到這一點?

+4

好像取代爲它應該是相同的(http://dev.mysql.com/doc/refman/5.0/en/create-table -select.html)語法。你有錯誤嗎? –

+0

這不是一個語法問題,所以你應該發佈你的錯誤日誌。請在[sqlfiddle](http://sqlfiddle.com/#!2/dc9b9) –

回答

1

如果你正在使用MySQL的是舊版本,那麼你可能有性能問題in。這是一個替代方案,它應該可以在MySQL和Oracle中工作:

CREATE TABLE SCT_201301_UMLS_SYN 
AS SELECT DISTINCT A.SCUI "SNOMED_CODE", A.STR "SNOMED_DISPLAY_NAME" 
    , B.STR "UMLS_SYNONYM" 
FROM MRCONSO A join 
    MRCONSO_UMLS B 
    on A.CUI = B.CUI 
WHERE exists (SELECT 1 
       FROM SnomedCTtoICD10 s 
       where s.referencedComponentId = a.scui) 
AND A.SAB='SNOMEDCT' 
AND A.SUPPRESS='N' 
AND A.TTY='PT' 
AND B.LAT='ENG' 
AND B.SUPPRESS='N' 
+0

這似乎工作,但失敗的連接失敗......我認爲,因爲表是如此之大,它仍然失去了連接? – NCoder

1

不知道爲什麼你的陳述沒有工作,但你可以使用ANSI語法嘗試:

CREATE TABLE SCT_201301_UMLS_SYN 
AS 
SELECT DISTINCT A.SCUI "SNOMED_CODE", A.STR "SNOMED_DISPLAY_NAME" , B.STR "UMLS_SYNONYM" 
    FROM MRCONSO A 
     join MRCONSO_UMLS B 
     using (CUI) 
WHERE A.SCUI IN (SELECT referencedComponentId 
        FROM SnomedCTtoICD10) 
    AND A.SAB='SNOMEDCT' 
    AND A.SUPPRESS='N' 
    AND A.TTY='PT' 
    AND B.LAT='ENG' 
    AND B.SUPPRESS='N' 
; 
+0

中查看它,如果它不返回錯誤,我會馬上接受它。謝謝! – NCoder

0

該查詢應該在MySQL(> = 5.1)中正常工作。 MySQL應該接受這種語法。

但是可能會有一些差異。默認情況下,Oracle是「區分大小寫的」,MySQL不是。因此,您可能遇到的一個差異是由DISTINCT關鍵字消除的行數。 (您也可能會遇到Oracle和Oracle或MySQL和MySQL之間的這種區別)。

顯然,SELECT語句引用的表需要存在於本地MySQL數據庫中,並且運行該查詢的用戶需要具有SELECT特權對他們。 (在Oracle中,這些引用可能引用視圖或同義詞,而不是表。而這些觀點和同義詞可能在其他架構參考對象。)

MRCONSO 
MRCONSO_UMLS 
SnomedCTtoICD10 

這不是可以運行在MySQL查詢檢索來自遠程Oracle數據庫的數據。因此,爲了使這個查詢起作用,這些對象將需要存在於本地MySQL數據庫中。

0

Oracle人員通過向「Where」子句添加更多條件來定義應該連接表的方式。 MySql人員在連接語句中定義連接。因此,移動

AND B.LAT='ENG' 
AND B.SUPPRESS='N' 
AND A.CUI=B.CUI 

FROM MRCONSO A join MRCONSO_UMLS B 
on B.LAT='ENG' 
AND B.SUPPRESS='N' 
AND A.CUI=B.CUI