我有一个旧的数据表(在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”子句上运行聚合,但同样,这对我来说似乎也不对。
有关如何进行的任何建议?
答案 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