有一个要求:
WITH ParentCTE (ID, NAME)
AS
(
SELECT ROW_NUMBER() OVER(ORDER BY [Торговое наименование]) AS ID,
[Торговое наименование] AS NAME
FROM [Test].[dbo].[Nomenclature]
GROUP BY [Торговое наименование]
)
SELECT ROW_NUMBER() OVER(ORDER BY [Торговое наименование]) AS ID,
[Торговое наименование] AS NAME,
[Наименование товара на этикетке] AS Name_of_sec_pack,
GTIN,
(SELECT ID FROM ParentCTE WHERE ParentCTE.NAME = Nomenclature.[Торговое наименование]) AS PARENT_ID
FROM [Test].[dbo].[Nomenclature]
查询结果:
| ID | NAME | Name_of_sec_pack | GTIN | PARENT_ID |
| --- | --------- | ----------------------------- | ---- | ---------- |
| 1 | Амлодипин | таблетки "амлодипин" по 25 мг | 1111 | 1 |
| 2 | Амлодипин | таблетки "амлодипин" по 50 мг | 1120 | 1 |
| 3 | Анальгин | Анальгин таблетки 300 мг №10 | 1148 | 2 |
| ... | ... | ... | ... | ... |
父母CTE:
| ID | NAME |
| --- | ---------- |
| 1 | Амлодипин |
| 2 | Анальгин |
| ... | ... |
问题:
如何将它们组合成这样?
| ID | NAME | Name_of_sec_pack | GTIN | PARENT_ID |
| --- | --------- | ----------------------------- | ---- | ---------- |
| 1 | Амлодипин | | | |
| 2 | Амлодипин | таблетки "амлодипин" по 25 мг | 1111 | 1 |
| 3 | Амлодипин | таблетки "амлодипин" по 50 мг | 1120 | 1 |
| 4 | Анальгин | | | |
| 5 | Анальгин | Анальгин таблетки 300 мг №10 | 1148 | 4 |
| ... | ... | ... | ... | ... |
Microsoft SQL Server 2012 (SP4-GDR) (KB4583465) - 11.0.7507.2 (X64) Nov 1 2020 00:48:37 版权所有 (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.2 (Build 9200:) (管理程序)
更新:
创建表
USE [Test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Nomenclature](
[GTIN] [nvarchar](max) NULL,
[Торговое наименование] [nvarchar](max) NULL,
[Наименование товара на этикетке] [nvarchar](max) NULL,
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
插入
USE [Test]
GO
INSERT INTO [dbo].[Nomenclature]
([GTIN]
,[Торговое наименование]
,[Наименование товара на этикетке])
VALUES
('1111', 'Амлодипин', 'таблетки "амлодипин" по 25 мг'),
('1120', 'Амлодипин', 'таблетки "амлодипин" по 50 мг'),
('1148', 'Анальгин', 'Анальгин таблетки 300 мг №10')
GO
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=d0dda15cafb48b179db1b3619755b009
PS。优化 - 懒惰。