首页 > 解决方案 > SQL Server 查询对记录进行分组并插入到其他表中

问题描述

我正在使用具有表 x、y 和映射表 xy 的 SQL Server 数据库。

我有一个带有 x_id、日期、文本和接收者 ID 的表 X,以及带有 x_id 和 y_id 的映射表 xy。我需要一个脚本来生成 XY 和 Y 表,这样对于每个唯一的文本都应该在 y 表中有一条记录,并且根据接收者的数量应该在 XY 表中进行映射。Y 表中的日期列应填充该特定文本的最短日期。

表:×

x_id             date               text           receiver
---------------------------------------------------------
| 1  |  2019-02-22 20:40:30.617  |    txt1   |        4
| 2  |  2019-02-22 20:40:06.103  |    txt1   |        5
| 3  |  2019-02-22 20:28:21.393  |    txt2   |        4

因此,上述记录的 XY 和 Y 中的最终数据应以

表:是

y_id             date               text
---------------------------------------------
| 1  |  2019-02-22 20:40:06.103   |    txt1   | 
| 2  |  2019-02-22 20:28:21.393   |    txt2   |

表:XY

y_id   x_id 
-----------
| 1  |  1  
| 1  |  2 
| 2  |  3  

标签: sqlsql-server

解决方案


首先从 Y 表中获取数据并插入,我使用 Row Number 作为 Y 表的 Id,如果需要,您可以为其创建标识。第二个选择 XY 表的数据,并使用 X 和 Y 表文本属性连接。

请不要对字段名称使用任何关键字,例如文本或日期。

DECLARE @x TABLE(
x_id int,
date datetime,
text varchar(100),
receiver int
)

insert INTO @x
(
    x_id,
    [date],
    [text],
    receiver
)
VALUES
(1,'2019-02-22 20:40:30.617 ','txt1',4),
(2,'2019-02-22 20:40:06.103 ','txt1',5),
(3,'2019-02-22 20:28:21.393 ','txt2',4)


--for Y table
--insert into Y
SELECT ROW_NUMBER() OVER(ORDER BY [text] ASC) AS Id, Min(date) AS [date], [text] 
INTO #Y
FROM @x
GROUP BY [text]

--for XY table
SELECT Y.Id AS y_id, X.x_Id AS x_id FROM @x AS X
    INNER JOIN #Y Y ON X.[text] = Y.[text]

DROP TABLE #Y

推荐阅读