如果另一个表中的所有链接值(外键链接行)也相同,如何删除重复项

问题描述 投票:0回答:1

我有三张桌子:


x(第 1 列,...,x_id)


y(列 1,列 2,列 3,...,x_id,y_id)


z(列 1,列 2,列 3,...,x_id,y_id,z_id)

我的最终目标:如果 z 表中的所有链接值(基于外键)也完全相同,则删除 y 表中的重复项。 例如,这只是一个例子。

为了获得更多说明,请考虑以下示例: y 表:我的表结构与此非常相似,并且该表接近我所拥有的实际情况。

第 1 栏 第 2 栏 x_id y_id
酒吧 1 1
酒吧 1 2
xx yy 2 3
zz kk 2 4
tt 毫米 2 5
巴兹 qux 3 6
巴兹 qux 3 7

有两个组,具有相同的第 1 列和第 2 列以及 x_id 值(y_ids = (1 和 2) 且 y_id == (6,7)。

然后对于这些行,我想检查第二个表以查看所有项目是否相同。这意味着它们在 z 表中具有相同的项目。 y_id = 1 和 y_id = 2 的项相同,因此 y 表中应删除其中一项。

{颜色:红色;}第 1 列 第 2 栏 专栏 x_id y_id z_id
酒吧 qux 1 1 1
foo2 酒吧2 qux2 1 1 2
酒吧 qux 1 2 3
foo2 酒吧2 qux2 1 2 4
巴兹 qux 3 6 5
巴兹2 foo2 qux1 3 6 6
巴兹3 foo3 qux2 3 6 7
巴兹 qux 3 7 8
巴兹2 foo2 qux1 3 7 9

我想从 y 表中删除 y_id = 1 的行(或 y_id = 2,重复行没有区别)。表非常大,因此快速解决方案会很棒。我知道我可以加入表格,但我希望我能找到另一个解决方案。一种可以使用 ID 分组并仅在 z 表(第三个表)内查找找到的项目的解决方案

sql sql-server group-by duplicates outer-join
1个回答
0
投票

我相信下面的示例将帮助我删除我想要的行:

WITH cte AS (
    SELECT
        a.column1 AS a_column1,
        a.column2 AS a_column2,
        a.y_id AS a_y_id,
        a.x_id AS a_x_id,
        b.column1 AS a_column1,
        b.colum2 AS a_column2,
        b.y_id AS b_y_id ,
        b.x_id AS b_x_id 
    FROM YTable a
    JOIN YTable b
    ON a.column1 = b.column1 
        AND a.column2 = b.column2 
        AND a.x_id = b.x_id 
        AND a.y_id != b.y_id
    WHERE a.y_id < b.y_id
)
SELECT
    cte.*,
    CASE
        WHEN EXISTS (
            SELECT 1
            FROM (
                SELECT * FROM ZTable
                WHERE y_id = cte.y_id
            ) table1
            FULL JOIN (
                SELECT * FROM ZTable
                WHERE y_id = cte.y_id
            ) table2
            ON table1.colum1 = table2.column1
                AND table1.colum2 = table2.colum2
                AND table1.colum3 = table2.colum3
            WHERE table1.column1 IS NULL OR table2.column1 IS NULL
        )
        THEN 'Not Identical'
        ELSE 'Identical'
    END AS duplicated
FROM cte;
© www.soinside.com 2019 - 2024. All rights reserved.