我正在尝试将此查询从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
任何想法如何做到这一点?
答案 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