我有一个表A,其中的数据如下所示
Index Chapter1 Chapter2 .... Chapter20
1 CHE MTH NULL
2 ML NULL BIO
3 NULL DB HIST
我想在表格上方构建一个视图,这样应该给我类似以下的结果
Index Chapter
1 CHECh1
1 MTHCh2
..
2 MLCh1
..
2 BIOCh2
3 DBCh2
...and so on
我可以使用UNION操作构建一个可以为我提供正确结果的视图。
SELECT Index, CASE WHEN Chapter1 IS NOT NULL THEN Chapter1||'Ch1' END
from A
union
SELECT Index, CASE WHEN Chapter2 IS NOT NULL THEN Chapter2||'Ch2' END
from A
...
..
SELECT Index, CASE WHEN Chapter2 IS NOT NULL THEN Chapter20||'Ch20' END
from A
还有其他优化方法吗?任何帮助将不胜感激。
答案 0 :(得分:0)
各种形式的SQL支持横向联接。一种语法如下:
select t.index, v.chapter || 'Ch' || v.n
from t cross join lateral
(values (chapter1, 1), (chapter2, 2), . . . ) v(chapter, n)
where chapter is not null;
但是,如果数据库没有,请不要绝望。您可以使用cross join
做类似的事情:
select id, chapter || 'Ch' || n
from (select t.id,
(case when n = 1 then chapter1
when n = 2 then chapter2
. . .
when n = 20 then chapter20
end) as chapter, v.n
from t cross join
(values (1), (2), (3), . . . ) v(n) -- or the equivalent for your database to get a table with 20 numbers
) tc
where chapter is not null;
这两种方法都只扫描表一次,这应该是性能上的改进。如果“表”确实是一个复杂的查询,那么这将是一个很大的改进。