将oracle查询转换为MySQL查询

时间:2013-07-11 17:47:12

标签: mysql oracle

我正在尝试将此查询从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 个答案:

答案 0 :(得分: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'
;

答案 1 :(得分: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' 

答案 2 :(得分:0)

该查询在MySQL中应该可以正常工作(> = 5.1)。 MySQL应该接受这种语法。

但可能存在一些差异。默认情况下,Oracle是“区分大小写”而MySQL不是。因此,您可能遇到的一个区别是DISTINCT关键字消除的行数。 (您也可能会遇到Oracle和Oracle,MySQL和MySQL之间的这种差异。)

显然,SELECT语句引用的表需要存在于本地MySQL数据库中,运行查询的用户需要具有SELECT权限。 (在Oracle中,这些引用可能是对视图或同义词的引用,而不是表。这些视图和同义词可能引用其他模式中的对象。)

MRCONSO
MRCONSO_UMLS
SnomedCTtoICD10

无法在MySQL上运行查询以从远程Oracle数据库检索数据。因此,要使此查询起作用,那些对象将需要存在于本地MySQL数据库中。

答案 3 :(得分:0)

Oracle人员通过向“Where”子句添加更多条件来定义表的连接方式。 MySql人员在join语句中定义连接。所以移动

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