【问题标题】:Same ID field on multiple tables多个表上的相同 ID 字段
【发布时间】:2014-08-15 11:50:44
【问题描述】:

所以我得到了一个任务,我应该展示以下内容:

ID, LNAME, FNAME, MNAME, BIRTH_DATE, RELG_CODE, NAT_CODE, PT_STATUS, RM_NO, DTTM_ADM

这些表格是:

HISR_CODES, PASR_NAMES, PASR_PROFILE, PAST_PATIENT_ADM

--使用DESC查看它们--

所以当我查看它们时,我被告知这些表上的 ID 是相同的。所以到目前为止我在编码中所做的事情(我会完成剩下的,但我需要先确保它有效):

SELECT
    A.ID,
    A.LNAME,
    A.FNAME,
    A.MNAME,
    A.BIRTH_DATE,
    C.RELG_CODE,
    C.NAT_CODE,
    B.PT_STATUS,
    B.RM_NO,
    B.DTTM_ADM
FROM
    PASR_NAMES A,
    PASR_PROFILE B,
    PAST_PATIENT_ADM C,
    HISR_CODES D

WHERE
    A.ID = B.ID
AND
    B.ID = C.ID
AND
    C.ID = D.ID

有没有办法判断表格中的所有 ID 都相同?比这样简单的代码:

WHERE
        A.ID = B.ID
    AND
        B.ID = C.ID
    AND
        C.ID = D.ID

或者JOIN - ON 是唯一的选择吗?

【问题讨论】:

标签: sql oracle


【解决方案1】:

使用正确的join 语法:

FROM PASR_NAMES A JOIN
     PASR_PROFILE B
     ON A.ID = B.ID JOIN
     PAST_PATIENT_ADM C
     ON B.ID = C.ID JOIn
     HISR_CODES D
     ON C.ID = D.ID

或者:

FROM PASR_NAMES A JOIN
     PASR_PROFILE B
     USING (ID) JOIN
     PAST_PATIENT_ADM C
     USING (ID)
     HISR_CODES D
     USING (ID)

我不鼓励您使用natural join。起初这似乎是正确的事情。但是,查询的语义高度依赖于表的结构。如果列被重命名、删除或添加,查询可能仍然有效,但会产生非常意外的结果。

【讨论】:

  • 自然连接,看到名字我也想到了。
【解决方案2】:

您可以如下使用自然连接:

SELECT
    A.ID,
    A.LNAME,
    A.FNAME,
    A.MNAME,
    A.BIRTH_DATE,
    C.RELG_CODE,
    C.NAT_CODE,
    B.PT_STATUS,
    B.RM_NO,
    B.DTTM_ADM
FROM
    PASR_NAMES A
    NATURAL JOIN PASR_PROFILE B
    NATURAL JOIN PAST_PATIENT_ADM C
    NATURAL JOIN HISR_CODES D;

来自 Oracle 参考,“自然连接基于两个表中同名的所有列。”因此,连接也有可能基于其他列发生。因此,建议您仍然使用 INNER JOIN 语法并明确指定 JOIN 列。

参考文献

NATURAL JOIN on Oracle® Database SQL Language Reference

Related SO question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多