0

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

4 回答 4

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'
;
于 2013-07-11T17:57:27.117 回答
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' 
于 2013-07-11T18:30:03.253 回答
0

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

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

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

MRCONSO
MRCONSO_UMLS
SnomedCTtoICD10

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

于 2013-07-11T18:36:01.807 回答
0

Oracle 人员通过在“Where”子句中添加更多条件来定义表的连接方式。MySql 人在 join 语句中定义了 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 
于 2013-07-11T18:36:29.817 回答