我有一组数据,基本上是这样的:
工作行 | 时间 | 日期 | 职位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 查询中完成此操作?
自连接的另一种选择是使用窗口函数: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 | 空 |
自连接可用于查找与 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