oracle 从具有通用列和非通用列的2个表中获取记录

xdnvmnnf  于 2022-12-26  发布在  Oracle
关注(0)|答案(1)|浏览(153)

下面是我遇到的问题的类似示例:
如果我有这个 * 表1 *:
| 患者ID|姓名|入住日期|订单名称|执行人|
| - ------| - ------| - ------| - ------| - ------|
| 1个|杰克|二○ ○二年九月十二日|X射线|Dr.Amal|
| 第二章|诺拉|二○ ○二年十月十五日|超音波|Dr.Goerge|
| 1个|杰克|二○ ○三年十一月十三日|医学|Dr.Fred|

  • 表二 *:

| 患者ID|姓名|入住日期|订单名称|
| - ------| - ------| - ------| - ------|
| 1个|杰克|二零零二年六月十四日|X射线2|
| 第二章|诺拉|二○ ○二年十月十五日|超音波|
| 1个|杰克|二○ ○三年十一月十三日|医学|
| 三个|拉斐尔|二○ ○三年十一月十三日|疫苗|
我需要的结果如下:
| 姓名|入住日期|订单名称|执行人|
| - ------| - ------| - ------| - ------|
| 杰克|二○ ○二年九月十二日|X射线|Dr.Amal|
| 诺拉|二○ ○二年十月十五日|超音波|Dr.Goerge|
| 杰克|二○ ○三年十一月十三日|医学|Dr.Fred|
| 杰克|二零零二年六月十四日|X射线2|无效|
| 拉斐尔|二○ ○三年十一月十三日|疫苗|无效|
如果您注意到,我需要的结果是表1和表2中的所有记录,没有重复,连接相同的公共字段,并添加表1中的"Preformed by"列。我尝试按如下方式使用"UNION":

SELECT Name, Check_in_Date, order_name,preformed_by
  FROM table1 
UNION 
SELECT Name, Check_in_Date, order_name,''
  FROM table2

我得到的结果是每个患者有2条记录,日期相同,一条记录由一条记录执行,一条记录为空,如下所示:
| 姓名|入住日期|订单名称|执行人|
| - ------| - ------| - ------| - ------|
| 杰克|二○ ○二年九月十二日|X射线|Dr.Amal|
| 诺拉|二○ ○二年十月十五日|超音波|Dr.Goerge|
| 诺拉|二○ ○二年十月十五日|超音波|无效|
| 杰克|二○ ○三年十一月十三日|医学|Dr.Fred|
| 杰克|二○ ○三年十一月十三日|医学|零|
| 杰克|二零零二年六月十四日|X射线2|无效|
| 拉斐尔|二○ ○三年十一月十三日|疫苗|无效|
如果同一ID在两个表中具有相同的登记日期,则必须返回表1中的执行人,而不是空值。我该如何操作?
谢谢你。

bwleehnv

bwleehnv1#

您需要的是一个**FULL JOIN匹配这三个列沿着NVL()**函数,以便从 table2 中获取值,该值从 table1 返回null,例如

SELECT NVL(t1.name,t2.name) AS name,
       NVL(t1.check_in_date,t2.check_in_date) AS check_in_date,
       NVL(t1.order_name,t2.order_name) AS order_name,
       t1.preformed_by 
  FROM table1 t1
  FULL JOIN table2 t2
    ON t1.name = t2.name
   AND t1.check_in_date = t2.check_in_date
   AND t1.order_name = t2.order_name

***或*另一个方法使用UNION**筛选出重复项,然后应用OUTER JOIN,如

SELECT tt.name, tt.check_in_date, tt.order_name, t1.preformed_by 
  FROM (
        SELECT name, check_in_date, order_name FROM table1 UNION
        SELECT name, check_in_date, order_name FROM table2
       ) tt
  LEFT JOIN table1 t1
    ON t1.name = tt.name
   AND t1.check_in_date = tt.check_in_date
   AND t1.order_name = tt.order_name

Demo

相关问题