Sql 行-列遍历
我有以下格式的数据Sql 行-列遍历,sql,hana,Sql,Hana,我有以下格式的数据 id idnew 1 2 3 4 2 4 7 6 8 7 结果应该是这样的 ID后面应该跟idnew 1 2 3 4 2 4 7 6 8 7 Thanks in advance 这应维持秩序: SELECT id FROM ( SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS RowNu
id idnew
1 2
3 4
2
4 7
6 8
7
结果应该是这样的
ID后面应该跟idnew
1
2
3
4
2
4
7
6
8
7
Thanks in advance
这应维持秩序:
SELECT id
FROM (
SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS RowNumber
FROM myTable
UNION ALL
SELECT idnew, ROW_NUMBER() OVER (ORDER BY idnew) +
(SELECT COUNT(*) FROM dbo.myTable) AS RowNumber
FROM myTable
WHERE idnew IS NOT NULL
) a
ORDER BY RowNumber
我假设id列不能为NULL
注意:如果要保留idnew列中的空值并保持顺序,请在第二个select中删除WHERE子句和order BY id:
SELECT id
FROM (
SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS RowNumber
FROM myTable
UNION ALL
SELECT idnew, ROW_NUMBER() OVER (ORDER BY id) +
(SELECT COUNT(*) FROM dbo.myTable) AS RowNumber
FROM myTable
) a
ORDER BY RowNumber
这应维持秩序:
SELECT id
FROM (
SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS RowNumber
FROM myTable
UNION ALL
SELECT idnew, ROW_NUMBER() OVER (ORDER BY idnew) +
(SELECT COUNT(*) FROM dbo.myTable) AS RowNumber
FROM myTable
WHERE idnew IS NOT NULL
) a
ORDER BY RowNumber
我假设id列不能为NULL
注意:如果要保留idnew列中的空值并保持顺序,请在第二个select中删除WHERE子句和order BY id:
SELECT id
FROM (
SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS RowNumber
FROM myTable
UNION ALL
SELECT idnew, ROW_NUMBER() OVER (ORDER BY id) +
(SELECT COUNT(*) FROM dbo.myTable) AS RowNumber
FROM myTable
) a
ORDER BY RowNumber
这是经过充分测试的,请在此处尝试: 如您所述设置表格:
CREATE TABLE myTable (id INT, idnew INT);
INSERT INTO myTable (id, idnew)
VALUES (1, 2),
(3, 4),
(2, NULL),
(4, 7),
(6, 8),
(7, NULL);
SELECT * FROM myTable;
下面是执行此技巧的查询:
SELECT mixed_id FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS row_num,
id,
idnew
FROM myTable
) AS x
UNPIVOT
(
mixed_id for item in (id, idnew)
) AS y
WHERE mixed_id IS NOT NULL
ORDER BY row_num, mixed_id;
为了不使查询进一步复杂化,这是在利用“id”作为字符串排在“idnew”之前。我相信字符串排名不是这里的关键问题。这是经过充分测试的,请在这里尝试: 如您所述设置表格:
CREATE TABLE myTable (id INT, idnew INT);
INSERT INTO myTable (id, idnew)
VALUES (1, 2),
(3, 4),
(2, NULL),
(4, 7),
(6, 8),
(7, NULL);
SELECT * FROM myTable;
下面是执行此技巧的查询:
SELECT mixed_id FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS row_num,
id,
idnew
FROM myTable
) AS x
UNPIVOT
(
mixed_id for item in (id, idnew)
) AS y
WHERE mixed_id IS NOT NULL
ORDER BY row_num, mixed_id;
为了不使查询进一步复杂化,这是在利用“id”作为字符串排在“idnew”之前。我相信字符串排名不是这里的关键问题。使用交叉应用
;WITH CTE (id,idnew)
AS
(
SELECT 1,2 UNION ALL
SELECT 3,4 UNION ALL
SELECT 2,NULL UNION ALL
SELECT 4,7 UNION ALL
SELECT 6,8 UNION ALL
SELECT 7,NULL
)
SELECT New
FROM CTE
CROSS APPLY ( VALUES (id),(idnew))AS Dt (New)
WHERE dt.New IS NOT NULL
结果
New
---
1
2
3
4
2
4
7
6
8
7
使用交叉应用
;WITH CTE (id,idnew)
AS
(
SELECT 1,2 UNION ALL
SELECT 3,4 UNION ALL
SELECT 2,NULL UNION ALL
SELECT 4,7 UNION ALL
SELECT 6,8 UNION ALL
SELECT 7,NULL
)
SELECT New
FROM CTE
CROSS APPLY ( VALUES (id),(idnew))AS Dt (New)
WHERE dt.New IS NOT NULL
结果
New
---
1
2
3
4
2
4
7
6
8
7
如果您的
订购人
中没有要使用的字段,我不确定这将如何工作。如果您的订购人
中没有要使用的字段,我不确定这将如何工作。这一顺序将与预期结果不同。这就是这个问题的问题所在-如果不指定orderby
子句,如果没有它的任意性,+1用于贡献和使用union all
,则无法保证结果的顺序。您可能需要使用where
子句从idnew
中排除一些null
记录。此处的顺序是关键的。好吧,我没有意识到顺序是关键的。其顺序与预期结果不同。这就是这个问题的问题所在-如果不指定orderby
子句,如果没有它的任意性,+1用于贡献和使用union all
,则无法保证结果的顺序。您可能需要使用where
子句从idnew
中排除一些null
记录。此处的顺序是关键的OK,我没有意识到顺序是关键的这一事实。