在特定条件下连接Acces中的行

时间:2017-10-06 10:39:30

标签: ms-access

我正在访问2010年我有一个表格,其格式如下:

ID BOORP BEGIN_DIEPTE EIND_DIEPTE TEXTUUR1 1 148000 0 10 ZK 2 148000 20 60 ZK 3 148000 60 80 MK 4 148000 80 110 MK 5 148000 110 130 ZK 6 148000 130 160 - 7 148000 160 220 ZZL 8 148000 220 250 - 9 148000 250 300 MK 10 148001 0 20 ZK 11 148001 20 40 - 12 148001 40 210 ZZL 13 148001 210 310 ZZL

我想要的是在以下条件下连接具有相同纹理的某些行:

1)行必须具有相同的BOORP才能合并

2)只能合并连续的行

结果应如下所示:

ID BOORP BEGIN_DIEPTE EIND_DIEPTE TEXTUUR1 1 148000 0 60 ZK 3 148000 60 110 MK 5 148000 110 130 ZK 6 148000 130 160 - 7 148000 160 220 ZZL 8 148000 220 250 - 9 148000 250 300 MK 10 148001 0 20 MK 11 148001 20 40 - 12 148001 40 310 ZZL
特别是我遇到问题的第二个条件。 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

作为纯SQL解决方案,这是一项非常复杂的任务。 如果要在一个查询中执行此操作,可以使用以下解决方案(在示例数据上测试):

SELECT e.ID, e.BOORP, e.BEGIN_DIEPTE, e.EINDDIEPTE As EIND_DIEPTE, e.TEXTUUR1 
FROM
(
    SELECT a.ID, a.BOORP, a.BEGIN_DIEPTE, IIF(b.ID Is Null, a.EIND_DIEPTE, b.EIND_DIEPTE) AS EINDDIEPTE, a.TEXTUUR1, b.ID As IDJoined
    FROM TestTable a
    LEFT JOIN
        (
            SELECT c.*, (SELECT Max(d.ID) FROM TestTable d WHERE d.ID < c.ID) As PreviousID
            FROM TestTable c
        ) As b
    ON b.PreviousID = a.ID AND b.BOORP = a.BOORP AND a.TEXTUUR1 = b.TEXTUUR1
) AS e
WHERE e.ID NOT IN (
    SELECT b.ID
    FROM TestTable a
    INNER JOIN
        (
            SELECT c.*, (SELECT Max(d.ID) FROM TestTable d WHERE d.ID < c.ID) As PreviousID
            FROM TestTable c
        ) As b
    ON b.PreviousID = a.ID AND b.BOORP = a.BOORP AND a.TEXTUUR1 = b.TEXTUUR1
)

这是很多子查询,而且有点太多无法深入解释。简单地说,最内部的子查询(查询bLEFT JOIN在等于​​BOORPTEXTUUR1上,其中ID是先前的ID,然后是外部子查询(查询{ {1}})获取结果,并删除已与另一个条目连接的所有条目。

请注意,这会将2个条目连接在一起,而不是更多。如果要将两个以上的条目连接在一起,则可以对此结果运行类似的查询。