当连接表时使用相同的“键”来压缩行
问题描述:
我有两个表,一个是对象,一个是对象的属性。两张表都有一个个人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
答
使用附加列,使每个键唯一两表所示。例如在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;
然后,我得到所有可能的联合对象与每个(PersonID,日期)属性的两个表中相同,而不是一个单一的工作“水平”([A,B,C]与[1 (A,1),(B,2),(C,3)],而不是[[(A,1), (B,1),(B,2)等) – DaanK 2014-10-20 09:53:25