Oracle

如何從連接中獲取選擇,其中一個表中沒有結果

  • September 2, 2018

我在一個 oracle 數據庫中工作,並希望獲得一些查詢來辨識客戶的任何地址更改。我正在根據每日批處理過程中的結果創建報告。我將以簡化表結構為例。

我有 2 張桌子正在使用。每個都是一個審計表,它通過觸發器跟踪更新和插入等更改。每個表還有一列儲存更改日期。

一個表包含縣程式碼,另一個包含街道地址:t_county 和 t_address

t_county

  • 編號:數字(9)
  • 縣: NUMBER(2)
  • 日期:日期

t_address

  • 編號:數字(9)
  • 地址:VARCHAR2(60)
  • 日期:日期

我需要建構一個查詢來選擇縣和地址,如果其中一個在特定日期有一行。

假設某一天地址發生變化,但縣內沒有變化。我希望查詢有如下結果

+---------+---------+--------+
|    ID   |  County | Address|
+---------+---------+--------+
|     1   |  NULL   |123 test|
+---------+---------+--------+

如果縣有變更但地址相同:

+---------+---------+--------+
|    ID   |  County | Address|
+---------+---------+--------+
|     1   |  32     |  NULL  |
+---------+---------+--------+

如何建構這樣的查詢?

這是一個選項,它使用UNION這些表。聚合(MAX)用於在一行中顯示縣和地址的*變化;*否則,你會得到兩個單獨的行。如果在一個日期內有多個更改,這將無法正常工作。

SQL> with t_county (id, county, cdate) as
 2    (select 1, 10, date '2018-08-02' from dual union all
 3     select 2, 20, date '2018-08-05' from dual
 4    ),
 5  t_address (id, address, cdate) as
 6    (select 1, '123 test', date '2018-08-10' from dual union all
 7     select 2, '222 twix', date '2018-08-05' from dual
 8    ),
 9  -- union of those tables
10  t_union as
11    (select id, county     , null address, cdate from t_county union all
12     select id, null county, address     , cdate from t_address
13    )
14  select id,
15    max(county) county,
16    max(address) address
17  from t_union
18  where cdate = to_date('&par_date', 'yyyy-mm-dd')
19  group by id;
Enter value for par_date: 2018-08-02

       ID     COUNTY ADDRESS
---------- ---------- --------
        1         10

SQL> /
Enter value for par_date: 2018-08-05

       ID     COUNTY ADDRESS
---------- ---------- --------
        2         20 222 twix

SQL>

引用自:https://dba.stackexchange.com/questions/216455