在SQL中是否有替代方法可以将Union用于此方案?

时间:2019-07-30 20:00:02

标签: sql union

我有一个表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

还有其他优化方法吗?任何帮助将不胜感激。

1 个答案:

答案 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;

这两种方法都只扫描表一次,这应该是性能上的改进。如果“表”确实是一个复杂的查询,那么这将是一个很大的改进。