从相关组导出数据的最佳SQL查询方法是什么?

时间:2017-07-14 12:14:22

标签: sql-server ms-access

我有一个旧的数据表(在MS ACCESS中,如果你可以相信的话)应该是来自旧电子商务商店的“相关产品”。我正试图为我的新店挽救这些相关产品。

包含以下字段/数据样本的数据集:

+---------+------------+-----------------+
| GroupID |  ProductId |       Sku       |
+---------+------------+-----------------+
|    1001 |      12473 |   C2S-44682-AMB |
|    1001 |       3628 |    C-43604-1    |
+---------+------------+-----------------+

“groupID”是关联 - 同一组中的productIds彼此相关。所以这两个产品是相互关联的,因为它们都属于GroupId 1001.总共有3500行数据。

我需要的是将这些相关产品导出到新表中,以便我可以导入到新商店并保留相关关系。新数据需要不同的格式化结构:

ParentId(第一个产品),ChildId(第二个,相关产品) 所以 - 使用上面的例子:

12473, 3628  (the first product should display the second)
3628, 12473  (the second product should display the first

我不确定如何创建正确的SQL查询来定位,循环并将这些新记录写入新数据库。

我想也许是一个“For / Each”循环,但是在寻找引用时,我似乎无法找到正确的上下文(很多PHP示例,但我在PHP中并不强大,并且真的认为必须是一个SQL方法来做到这一点)。您可以在SQL上的“having”子句上运行聚合,但同样,这对我来说似乎也不对。

有关如何进行的任何建议?

2 个答案:

答案 0 :(得分:1)

不需要循环......只需要自我加入。请注意,我在测试数据中添加了一些记录,以获得更深入的示例。

declare @oldTable table (GroupID int, ProductId int, Sku varchar(64))
insert into @oldTable 
values
(1001,12473,'C2S-44682-AMB'),
(1001,3628,'C-43604-1'),
(1001,4896,'C-43-558604-1'),
(1099,4458,'C-xxx-1'),
(1099,5217,'C-asbf3-1')

select
    t1.ProductId as parent
    ,t2.ProductId as Child
from 
    @oldTable t1
left join 
    @oldTable t2 on
    t1.GroupID = t2.GroupID
    and t1.ProductId <> t2.ProductId

<强>返回

+--------+-------+
| parent | Child |
+--------+-------+
|  12473 |  3628 |
|  12473 |  4896 |
|   3628 | 12473 |
|   3628 |  4896 |
|   4896 | 12473 |
|   4896 |  3628 |
|   4458 |  5217 |
|   5217 |  4458 |
+--------+-------+

答案 1 :(得分:0)

您需要自我加入,以便将所有产品与该组中的所有其他产品相匹配,但不包括初始产品。我相信这会为你做到这一点。

只需将dbo.Product替换为您的实际表名。

select
    ProductID           = P.ProductID,
    RelatedProductID    = R.ProductID
    from dbo.Product P
    join dbo.Product R on P.GroupID = R.GroupID and P.ProductID != R.ProductID