Sql 使用别名会导致某些无效标识符

Sql 使用别名会导致某些无效标识符,sql,oracle,alias,Sql,Oracle,Alias,我正在尝试创建一个表格,列出患者标识符,例如,一名患有感兴趣的原发肿瘤MCC_id.TUMOURID的患者在感兴趣的肿瘤发生前6个月内被诊断患有另一种肿瘤AV_TUMOURID 表MCC_id和AV_id中的列具有相同的名称,因此我添加了一些列别名。SQL开发人员似乎不喜欢这样,因为我一直收到“无效标识符”错误 我不知道还能尝试什么。救命啊 CREATE TABLE multitumours_hes_baseline AS ( SELECT mcc_ids.pat

我正在尝试创建一个表格,列出患者标识符,例如,一名患有感兴趣的原发肿瘤MCC_id.TUMOURID的患者在感兴趣的肿瘤发生前6个月内被诊断患有另一种肿瘤AV_TUMOURID

表MCC_id和AV_id中的列具有相同的名称,因此我添加了一些列别名。SQL开发人员似乎不喜欢这样,因为我一直收到“无效标识符”错误

我不知道还能尝试什么。救命啊

    CREATE TABLE multitumours_hes_baseline
    AS
        ( SELECT mcc_ids.patientid,
                 mcc_ids.tumourid,
                 av_tumour.tumourid AS other_tumourid,
                 av_tumour.diagnosisdatebest AS other_diagnosisdatebest,
                 av_tumour.site_icd10_o2_3char AS other_icd10,
                 av_tumour.morph_icd10_o2 AS other_morph
            FROM mcc_ids left
          JOIN av2016.av_tumour ON mcc_ids.patientid = av_tumour.patientid -- Joining AV_TUMOUR onto MCC_IDS by PATIENTID to ensure that we can count TUMOURIDs other than those contained in MCC_IDS
--WHERE (AV_TUMOUR.OTHER_DATE>'31-DEC-2012' AND AV_TUMOUR.OTHER_DATE<'01-JAN-2016')
           WHERE mcc_ids.tumourid != av_tumour.other_tumourid
           AND ( mcc_ids.diagnosisdatebest >= av_tumour.other_diagnosisdatebest ) -- Only those conditions that occur in HES before the date of cancer diagnosis
           AND ( mcc_ids.diagnosisdatebest - av_tumour.other_diagnosisdatebest ) <= 182.5 -- Only those conditions that occur up to six months prior to the date of diagnosis
           AND av_tumour.dedup_flag = 1
        );

除了order by子句外,不能在同一查询级别中引用列别名,但不需要在此处引用

你正在做:

WHERE MCC_IDS.TUMOURID!=AV_TUMOUR.OTHER_TUMOURID
AND (MCC_IDS.DIAGNOSISDATEBEST>=AV_TUMOUR.OTHER_DIAGNOSISDATEBEST)
AND (MCC_IDS.DIAGNOSISDATEBEST-AV_TUMOUR.OTHER_DIAGNOSISDATEBEST)<=182.5
而且,如果没有表前缀,则不能引用列别名,即WHERE mccu id.TUMOURID=OTHER_TUMOURID-因为它是相同级别的查询,并且因为查询是如何在内部解析的;:

c_别名 为列表达式指定别名。。。在查询期间,别名有效地重命名了选择列表项。别名可以在order_by_子句中使用,但不能在查询中的其他子句中使用

此外,这也不太相关,但要追溯到六个月前,您可以:

LEFT JOIN AV_TUMOUR ON AV_TUMOUR.PATIENTID = MCC_IDS.PATIENTID
WHERE AV_TUMOUR.OTHER_TUMOURID != MCC_IDS.TUMOURID
AND AV_TUMOUR.OTHER_DIAGNOSISDATEBEST >= ADD_MONTHS(MCC_IDS.DIAGNOSISDATEBEST, -6)
AND AV_TUMOUR.DEDUP_FLAG=1
您使用的是左外部联接,但由于WHERE子句中也有条件,因此实际上将其转换回内部联接。除非你想看到在那个时期没有其他肿瘤的MCC_ID,否则你可以移除“左”:

JOIN AV_TUMOUR ON AV_TUMOUR.PATIENTID = MCC_IDS.PATIENTID
WHERE AV_TUMOUR.OTHER_TUMOURID != MCC_IDS.TUMOURID
AND AV_TUMOUR.OTHER_DIAGNOSISDATEBEST >= ADD_MONTHS(MCC_IDS.DIAGNOSISDATEBEST, -6)
AND AV_TUMOUR.DEDUP_FLAG=1
如果您确实希望看到这些(从您的描述来看似乎不太可能),请将所有条件作为ON的一部分:


除了order by子句外,不能在同一查询级别中引用列别名,但不需要在此处引用

你正在做:

WHERE MCC_IDS.TUMOURID!=AV_TUMOUR.OTHER_TUMOURID
AND (MCC_IDS.DIAGNOSISDATEBEST>=AV_TUMOUR.OTHER_DIAGNOSISDATEBEST)
AND (MCC_IDS.DIAGNOSISDATEBEST-AV_TUMOUR.OTHER_DIAGNOSISDATEBEST)<=182.5
而且,如果没有表前缀,则不能引用列别名,即WHERE mccu id.TUMOURID=OTHER_TUMOURID-因为它是相同级别的查询,并且因为查询是如何在内部解析的;:

c_别名 为列表达式指定别名。。。在查询期间,别名有效地重命名了选择列表项。别名可以在order_by_子句中使用,但不能在查询中的其他子句中使用

此外,这也不太相关,但要追溯到六个月前,您可以:

LEFT JOIN AV_TUMOUR ON AV_TUMOUR.PATIENTID = MCC_IDS.PATIENTID
WHERE AV_TUMOUR.OTHER_TUMOURID != MCC_IDS.TUMOURID
AND AV_TUMOUR.OTHER_DIAGNOSISDATEBEST >= ADD_MONTHS(MCC_IDS.DIAGNOSISDATEBEST, -6)
AND AV_TUMOUR.DEDUP_FLAG=1
您使用的是左外部联接,但由于WHERE子句中也有条件,因此实际上将其转换回内部联接。除非你想看到在那个时期没有其他肿瘤的MCC_ID,否则你可以移除“左”:

JOIN AV_TUMOUR ON AV_TUMOUR.PATIENTID = MCC_IDS.PATIENTID
WHERE AV_TUMOUR.OTHER_TUMOURID != MCC_IDS.TUMOURID
AND AV_TUMOUR.OTHER_DIAGNOSISDATEBEST >= ADD_MONTHS(MCC_IDS.DIAGNOSISDATEBEST, -6)
AND AV_TUMOUR.DEDUP_FLAG=1
如果您确实希望看到这些(从您的描述来看似乎不太可能),请将所有条件作为ON的一部分:


请编辑您的问题,以包括两个源表的描述或DDL,以及您收到的完整错误消息?始终显示您收到的确切错误消息,始终。这些都来自数据库,而不是SQL Developer。请编辑您的问题,以包括两个源表的描述或DDL,以及您得到的完整错误消息?始终显示您得到的确切错误消息,始终。这些都来自数据库,而不是SQL开发者。我无法表达我对您在这方面的帮助的感激之情。我有大量的SQL工作要做,但直到几周前我才接触到它。这是一长串简单错误中的一个,这些错误占用了更多的时间,造成了比理想情况更多的白发。特别感谢您解释错误,而不是自己发布更正。大量帮助..@user518206。在堆栈溢出中,你可以通过接受答案来表达你的感激之情。我无法表达我对你在这方面的帮助的感激之情。我有大量的SQL工作要做,但直到几周前我才接触到它。这是一长串简单错误中的一个,这些错误占用了更多的时间,造成了比理想情况更多的白发。特别感谢您解释错误,而不是自己发布更正。大量帮助..@user518206。在Stack Overflow中,您可以通过接受答案来表示感谢。