sql - 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
解决方案
首先从 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
推荐阅读
- tomcat - 带有 Keycloak (8443) 身份验证的 IIS (443) 后面的 Tomcat (8080):tomcat 重定向到 443 端口而不是 8443 上的 keycloak
- c++ - ICU:ucnv_convertEx – 即时检测编码错误
- javascript - 向 JavaScript 平台游戏添加按钮
- python - 将列表插入到 postgres 表
- gremlin - 想要获取标签名称但返回 id,如果需要更改 gremlin 语句?
- python - 类不创建新的实例变量
- string - Talend- 使用 tmap 组件解析日期时的空字符串处理
- python - Django 'ProductDetailView' 对象没有属性 'user'
- node.js - 在 GET 请求中使用 HTTPOnly Cookie(使用 user_id cookie 从服务器检索用户信息)
- angular - rxjs - 是否有一个 always 运算符?你怎么总是做某事?