使用相同的"键"压缩行加入表格时

时间:2014-10-20 07:31:57

标签: sqlite join

我有两个表,一个包含对象,一个包含对象的属性。两个表都有一个个人ID和一个日期" key",但由于一个人可以在一天内完成多个对象订单,因此它并不匹配。但我确实知道,两个表中的条目都以相同的顺序输入,因此如果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       &

所以我想要做的就是加入两张桌子" zip"具有相同(PersonID,Date)" key"的条目组。

称为" Slick"似乎有这个(see here),但我想在SQLite中这样做。

任何建议都会很棒!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用其他列使两个表中的每个键都唯一。例如,在SQLite中,您可以使用RowID来跟踪插入顺序。将此附加列存储在数据库本身中对于其他查询也可能很有用,但您不必存储它。

首先将列ID添加到两个表中,DDL查询现在应如下所示:(确保在两个表都填满之前不添加主键约束。

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

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

现在填充ID列。您可以根据自己的喜好调整ID。确保你也为table2执行此操作:

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;