当连接表时使用相同的“键”来压缩行

问题描述:

我有两个表,一个是对象,一个是对象的属性。两张表都有一个个人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中做到这一点。

任何建议将是惊人的!

您正处在正确的轨道上。为什么不只是做表之间的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

使用附加列,使每个键唯一两表所示。例如在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;