我有三张桌子:
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 表(第三个表)内查找找到的项目的解决方案
我相信下面的示例将帮助我删除我想要的行:
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;