sql - 使用外部应用分配最低记录 ID
问题描述
假设我有这些表:
CREATE TABLE Employee (ID int, EmployeeIdentifier varchar(100),ManagerIdentifier varchar(100))
CREATE TABLE EmployeeManager (ID int, EmployeeID varchar(100))
INSERT Employee
VALUES
(1,'apple','apple'),
(2,'banana','apple'),
(3,'citrus','apple'),
(4,'grape','grape'),
(5,'grape','grape'),
(6,'grape','grape')
INSERT EmployeeManager
VALUES
(1,1),
(2,1),
(3,1),
(4,4),
(5,5),
(6,5)
对于Employee.ID IN (1,2,3)
, 中的记录EmployeeManager
看起来不错。但在Employee.ID IN (4,5,6)
我们可以看到许多重复。我们不允许从Employee
表中删除任何记录。但是我们可以自由分配EmpoyeeManager.EmployeeID
价值。由于只有一个实际记录,Grape
其余记录是重复的,我想从表中所有重复的葡萄记录中分配EmpoyeeManager.EmployeeID
一个最小值,也就是 4。Employee.ID
Employee
我有这个疑问,
UPDATE d SET EmployeeID = l.ID
FROM dbo.EmployeeManager d
INNER JOIN Employee s on d.ID=s.ID
OUTER APPLY (
SELECT ID
FROM Employee l
WHERE s.ManagerIdentifier=l.EmployeeIdentifier
) l
WHERE
EXISTS (
SELECT d.EmployeeID
EXCEPT
SELECT l.ID
)
如果您继续运行它,您将看到EmployeeManager.EmployeeID
ID (4,5,6) 的值将不断变化。我如何更新上面的更新语句以分配给Employee.ID
所有 EmployeeManager.ID (4,5,6) 的最小值,也就是 4?
我们不允许运行一次性修复脚本,因为上表的损坏数据会不断出现。
运行以上更新语句后所需的输出应该是
解决方案
您需要在TOP (1)
子ORDER BY
查询中选择特定行
UPDATE d SET EmployeeID = l.ID
FROM dbo.EmployeeManager d
INNER JOIN Employee s on d.ID=s.ID
OUTER APPLY (
SELECT TOP (1) ID
FROM Employee l
WHERE s.ManagerIdentifier = l.EmployeeIdentifier
ORDER BY ID
) l
WHERE
EXISTS (
SELECT d.EmployeeID
EXCEPT
SELECT l.ID
)
- 您似乎有一个规范化问题,因为
Manager
在两个地方定义 - 我建议你为你的表使用更好的别名,它们不是很容易记住
- 您可以将您的更改
OUTER
为CROSS
,然后您可以使用标准<>
而不是EXISTS/EXCEPT
CROSS APPLY (
SELECT TOP (1) ID
FROM Employee l
WHERE s.ManagerIdentifier = l.EmployeeIdentifier
ORDER BY ID
) l
WHERE d.EmployeeID <> l.ID
推荐阅读
- pandas - 根据 2 个条件选择组的行,但结合该组的唯一类别
- html - 我无法连接到引导程序
- reactjs - 如何在 NextJS 中以多步形式传递数据?
- c++ - c++ Jsoncpp错误
- javascript - 如何将此滑动面板 jQuery 插件设置为默认关闭?
- javascript - 使用 php、js、mysql、ajax 按连续数字列出关联数据
- java - JDK 安装在 mac 上,但我得到“操作无法完成。无法找到支持 apt 的 Java 运行时。” sudo apt 更新
- amazon-web-services - Apache Airflow 和 Apache Atlas 超时
- javascript - 具有多种用途的 React + Redux 状态
- laravel - 注销路由是否应该受到保护?