Db2

重複條目 - 第二個表的條件與連接

  • March 21, 2019

我有 2 張桌子(1. PLATE,2. MOVEMENT)。第一個表包含一些重複的車牌號。每個車牌號(欄位:PLATE_ID、PLATE_COUNTRY、PLATE_NUMBER)都有一個唯一的 id,它也存在於移動表(欄位:MOV_ID、MOV_ENTRYDATE、MOV_EXITDATE)中。如何找出具有移動日期的所有重複條目,其中第一個條目中的 MOV_EXITDATE = 第二個移動數據中的 MOV_ENTRYDATE。

例子:

PLATE_ID   PLATE_NUMBER   PLATE_COUNTRY
1          AS25           UK
2          AS25           UK
3          GG10           D
4          GG10           D
5          BB40           I

MOV_ID    MOV_COUNTRY   MOV_ENTRYDATE     MOV_EXITDATE
1         GB            2019-03-01        2019-03-05
2         GB            2019-03-05        0001-01-01
3         D             2019-02-01        2019-02-20
4         D             2019-02-21        0001-01-01
5         I             2019-01-01        0001-01-01

結果:

PLATE_ID   PLATE_NUMBER   PLATE_COUNTRY    MOV_ENTRYDATE     MOV_EXITDATE
1          AS25           UK               2019-03-01        2019-03-05
2          AS25           UK               2019-03-05        0001-01-01

注意:板 AS25 在表 PLATE 和 MOV_EXITDATE = MOV_ENTRYDATE 中重複。

我在下面的查詢沒有成功。

Select PLATE_ID, PLATE_NUMBER, PLATE_COUNTRY, MOV_ENTRYDATE, MOV_EXITDATE
from PLATE t

inner join (Select PLATE_ID, PLATE_COUNTRY, count(PLATE_NUMBER) from PLATE
group by PLATE_ID, PLATE_COUNTRY
having (count(PLATE_NUMBER) > '1')) k
on t.PLATE_ID = k.PLATE_ID and t.PLATE_COUNTRY = k.PLATE_COUNTRY

inner join (Select MOV_ID, MOV_COUNTRY, MOV_ENTRYDATE, min(MOV_EXITDATE) as minexitdate 
from MOVEMENT
group by MOV_ID, MOV_COUNTRY, MOV_ENTRYDATE) p
on t.PLATE_ID = p.MOV_ID and t.PLATE_COUNTRY = p.MOV_COUNTRY

inner join (Select MOV_ID, MOV_COUNTRY, MOV_EXITDATE, max(MOV_ENTRYDATE) as maxentrydate 
from MOVEMENT
group by MOV_ID, MOV_COUNTRY, MOV_EXITDATE) p
on t.PLATE_ID = p.MOV_ID and t.PLATE_COUNTRY = p.MOV_COUNTRY

where minexitdate = maxentrydate

謝謝,每一個有用的提示。

再會。

使用 WITH 語法,您的子查詢可能更具可讀性。

WITH PLATE_MOVEMENT AS (
   SELECT P.PLATE_ID, P.PLATE_NUMBER, P.PLATE_COUNTRY, 
          M.MOV_ENTRYDATE, M.MOV_EXITDATE
   FROM PRUEBA.PLATE P INNER JOIN PRUEBA.MOVEMENT M
        ON (P.PLATE_ID = M.PLATE_ID)
) 
SELECT A.PLATE_ID, A.PLATE_NUMBER, A.PLATE_COUNTRY, 
      A.MOV_ENTRYDATE, A.MOV_EXITDATE
FROM PLATE_MOVEMENT A INNER JOIN PLATE_MOVEMENT B
    ON  A.PLATE_NUMBER = B.PLATE_NUMBER
    AND A.PLATE_COUNTRY = B.PLATE_COUNTRY
    AND (A.MOV_EXITDATE = B.MOV_ENTRYDATE OR B.MOV_EXITDATE = A.MOV_ENTRYDATE)
-- optionally an order by
ORDER BY A.PLATE_COUNTRY, A.PLATE_NUMBER, A.MOV_ENTRY_DATE

結果

PLATE_ID    PLATE_NUMBER PLATE_COUNTRY MOV_ENTRYDATE MOV_EXITDATE
----------- ------------ ------------- ------------- ------------
         1 AS25         UK            03/01/2019    03/05/2019  
         2 AS25         UK            03/05/2019    01/01/0001  

 2 record(s) selected.

條件相當模糊

A.MOV_EXITDATE = B.MOV_ENTRYDATE OR B.MOV_EXITDATE = A.MOV_ENTRYDATE  

如果省略第二部分,則將省略歷史行的鍊式集合中的最後一行。如果省略第一部分,歷史行的鍊式集合中的第一行將失去。

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