样本表: -
CREATE TABLE emp1
(
seq_number int,
empid int,
ename varchar(50),
deptno int,
designation varchar(50),
sal int,
loc varchar(50)
)
插入
INSERT INTO emp1
VALUES (1, 458956, 'john', 10, 'Clerk', 1000, 'London'),
(2, 212854, 'Joseph', 20, 'CA', 7000, 'USA'),
(3, 100247, 'Arjun', 30, 'Manager', 10000, 'India'),
(4, 326856, 'Jim', 40, 'Senior Clerk', 6000, 'China'
(null 203323, 'Catherine', 40, 'Senior Clerk', 6000, 'China'),
(null, 152830, 'Mario', 60, 'BDM', 12000, 'Canada'),
(null, 200674, 'George', 10, 'SSE', 7000, 'Japan');
我尝试使用oracle 11g工作,但我想在mssql中。 oracle查询: -
SELECT
nvl (v.seq_number, v.m_seq + ROW_NUMBER () OVER (ORDER BY v.seq_number nulls FIRST, v.empid)) seq_number, v.empid, v.ename, v.loc, v.STATUS
FROM
(SELECT
e2.seq_number,
MAX(e2.seq_number) OVER () m_seq
FROM
emp2 e2
LEFT JOIN
emp1 e1 ON e1.seq_number = e2.seq_number) v
WHERE
v.status IS NOT NULL
ORDER BY seq_number
我要求在考虑seq_number的最大值时生成seq_number。如果seq_number从那里为空,它应该生成下一个seq_number。
O / P: -
101 458956 John 10 Clerk 1000 London
102 212854 Joseph 20 CA 7000 Canada
103 100247 Arjun 30 Manager 10000 India
104 326856 Jim 40 Senior Clerk 6000 China
105 203323, 'Catherine', 40, 'Senior Clerk', 6000, 'China'
106, 152830, 'Mario', 60, 'BDM', 12000, 'Canada'
107, 200674, 'George', 10, 'SSE', 7000, 'Japan'.
答案 0 :(得分:0)
对查询的唯一更改是将nvl()
更改为coalesce()
和ORDER BY
:
SELECT COALESCE(v.seq_number,
(v.m_seq +
ROW_NUMBER () OVER (ORDER BY (CASE WHEN v.seq_number IS NULL THEN 1 ELSE 2 END),
v.seq_number, v.empid
)
) seq_number, v.empid, v.ename, v.loc, v.STATUS
FROM (SELECT e2.seq_number, MAX(e2.seq_number) OVER () as m_seq
FROM emp2 e2 LEFT JOIN
emp1 e1
ON e1.seq_number = e2.seq_number
) v
WHERE v.status IS NOT NULL
ORDER BY seq_number;
这也适用于Oracle。