仅在特定条件下用同一个表中的其他数据替换 SELECT 中的值

问题描述 投票:0回答:2

我有一组数据,基本上是这样的:

工作行 时间 日期 职位ID 原始作业行
101 4 2001-06-13 21777A
269 12 2004-11-30 24999A 101
270 10 2006-06-02 26888A

我想找到一种方法从表中选择所有信息,将 OriginalJobRow 不为空的 JobID 值替换为 JobRow 列中等于 OriginalJobRow 值的 JobID,仅用于 SELECT 查询。

在此示例中,我希望我的 SELECT 返回 21777A 作为 JobRow 269 的 JobID,因为 OriginalJobRow 在该行上不为 null。

如何在 SELECT 查询中完成此操作?

sql sql-server
2个回答
1
投票

自连接的另一种选择是使用窗口函数:ed MAX 来获取每个“JobID/OriginalID”的值,例如:

SELECT  *
INTO #data
FROM    (
    VALUES  (101, 4, N'2001-06-13', N'21777A', NULL)
    ,   (269, 12, N'2004-11-30', N'24999A', 101)
    ,   (270, 10, N'2006-06-02', N'26888A', NULL)
) t (JobRow,Hours,Date,JobID,OriginalJobRow)

SELECT  MAX(case when OriginalJobRow is null then JobId end) OVER(PARTITION BY ISNULL(OriginalJobRow, JobRow)) AS JobIDNew
,   *
FROM    #data

一个小问题是我们需要优先考虑原始 jobRow 为 NULL 的行。

输出:

JobID新 工作行 时间 日期 职位ID 原始作业行
21777A 101 4 2001-06-13 21777A
21777A 269 12 2004-11-30 24999A 101
26888A 270 10 2006-06-02 26888A

0
投票

自连接可用于查找与 OriginalJobRow 相关的 JobID。如果有多行 JobRow=101,则每次匹配都会重复 JobRow 269。

SELECT e1.JobRow, e1.Hours, e1.Date, ISNULL(e2.JobID,e1.JobID) as JobID
FROM Example e1
LEFT JOIN Example e2 on e2.JobRow=e1.OriginalJobRow

小提琴

工作行 时间 日期 职位ID
101 4 2001-06-13 21777A
269 12 2004-11-30 21777A
270 10 2006-06-02 26888A

您还可以使用子查询。如果有多行 JobRow=101,则每个匹配都不会重复 JobRow 269。它将仅使用前 1 个值。添加 ORDER BY 以使结果可预测。

SELECT e1.JobRow, e1.Hours, e1.Date, 
ISNULL((SELECT  TOP 1 JobID FROM Example WHERE JobRow=e1.OriginalJobRow),e1.JobID) as JobID
FROM Example e1

摆弄重复项

© www.soinside.com 2019 - 2024. All rights reserved.