MS SQL Server-左表和右表中的左联接方式

  • 本文关键字:方式 SQL Server- MS sql-server
  • 更新时间 :
  • 英文 :


我在MS SQL Server中有两个表。

表A包含客户ID列表以及他们购买的产品。

产品被捆在一起形成一个包装。

表B包含产品组及其形成的包装。

示例:

表A:

CustID     Product
-------------------
10001      Mobo_1
10001      GPU_1
10002      Mobo_1
10002      GPU_2

表B:

Product    Package
-------------------
Mobo_1     Pack_A
GPU_1      Pack_A
Mobo_1     Pack_B
GPU_2      Pack_B

我想将Package列从表B映射到表A,考虑到特定客户购买的产品的特定组合,

即Mobo_1+GPU_1应当映射到Pack_A并且Mobo_1+TPU_2应当映射到Pack_B。

结果输出:

CustID     Product     Package
-------------------------------
10001      Mobo_1      Pack_A
10001      GPU_1       Pack_A
10002      Mobo_1      Pack_B
10002      GPU_2       Pack_B

我尝试过搜索LEFT JOIN+GROUP BY+WHERE条件,但似乎找不到任何类似的问题或解决方案。

是的,这是可以做到的,但需要付出一些努力

select a.CustID,
a.Product,
t3.Package
from   TableA a
left join ( select t.CustID,
t2.Package
from   ( select  a.CustID,
( select top 1 string_agg(a.Product, '+')
from   TableA a2
where  a2.CustID = a.CustID
) as Products
from    TableA a
group by a.CustID
) t   
left join ( select b.Package,
( select top 1 string_agg(b.Product, '+')
from   TableB b2
where  b2.Package = b.Package
) as Products
from   TableB b
group by b.Package
) t2 on t.Products = t2.Products
) t3 on a.CustID = t3.CustID  

结果是

CustID  Product Package
10001   Mobo_1  Pack_A
10001   GPU_1   Pack_A
10002   Mobo_1  Pack_B
10002   GPU_2   Pack_B

你可以在这个DBFiddle 上自己试试

编辑

我使用的技巧是将两个表的产品组合成一个varchar('Mobo_1+GPI_1'和'Mobo+1+GPI_2'(,然后您可以使用这些varchar进行连接
当您查看DBFiddle 中的最后一个查询时,会更清楚

最新更新