2013-07-11 134 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