2014-10-20 39 views
1

我有兩個表,一個是對象,一個是對象的屬性。兩張表都有一個個人ID和一個日期作爲「關鍵」,但是由於多個對象的訂單可以在一天內由一個人完成,所以它不能很好地匹配。不過,我知道這兩個表中的條目是以相同的順序輸入的,所以如果personID和日期相同,則可以加入訂單。當連接表時使用相同的「鍵」來壓縮行

這是我想要完成的任務:

Table 1: 
PersonID Date  Object 
1   20-08-2013 A 
2   13-11-2013 B 
2   13-11-2013 C 
2   13-11-2013 D 
3   21-11-2013 E 

Table 2: 
PersonID Date  Property 
4   05-05-2013 $   
1   20-08-2013^
2   13-11-2013/
2   13-11-2013 * 
2   13-11-2013 + 
3   21-11-2013 & 

Result: 
PersonID Date  Object Property 
4   05-05-2013   $ 
1   20-08-2013 A  ^
2   13-11-2013 B  /
2   13-11-2013 C  * 
2   13-11-2013 D  + 
3   21-11-2013 E  & 

所以我想要做的,是連接兩個表和「壓縮」組具有相同(是PersonID,日期)項「關鍵」。

東西叫「光滑」似乎有這個(see here),但我想在SQLite中做到這一點。

任何建議將是驚人的!

回答

1

您正處在正確的軌道上。爲什麼不只是做表之間的LEFT JOIN

select t2.PersonID, 
t2.Date, 
t1.Object, 
t2.Property 
from table2 t2 
left join table1 t1 on t2.PersonID = t1.PersonID 
order by t2.PersonID 
+0

然後,我得到所有可能的聯合對象與每個(PersonID,日期)屬性的兩個表中相同,而不是一個單一的工作「水平」([A,B,C]與[1 (A,1),(B,2),(C,3)],而不是[[(A,1), (B,1),(B,2)等) – DaanK 2014-10-20 09:53:25

0

使用附加列,使每個鍵唯一兩表所示。例如在SQLite中,您可以使用RowID來跟蹤插入的順序。在數據庫本身存儲這個額外的列本身也可能對其他查詢有用,但是您不必存儲它。

首先添加列ID這兩個表,DDL查詢現在應該是這樣的:(確保你不添加主鍵約束,直到兩個表都充滿

CREATE TABLE table1 ( 
    ID, 
    PersonID, 
    Date, 
    Object 
); 

CREATE TABLE table2 ( 
    ID, 
    PersonID, 
    Date, 
    Property 
); 

現在填充的ID。 。列您可以調整ID根據自己的喜好確保爲表2也這麼做。

UPDATE table1 
    SET ID =( 
     SELECT table1.PersonID || '-' || table1.Date || '-' || count(*) 
     FROM table1 tB 
     WHERE table1.RowID >= tB.RowID 
       AND 
       table1.PersonID == tB.PersonID 
       AND 
       table1.Date == tB.Date 
    ); 

現在你可以加入他們的行列:

SELECT t2.PersonID, 
    t2.Date, 
    t1.Object, 
    t2.Property 
FROM table2 t2 
    LEFT JOIN table1 t1 
      ON t2.ID = t1.ID; 
相關問題