【问题标题】:Simplifying SQL Select (att1, att2) union (att2, att1) to avoid copy and paste简化SQL Select(att1,att2) union(att2,att1)避免复制粘贴
【发布时间】:2018-04-13 06:30:12
【问题描述】:

我尝试简化以下代码,但除了复制和粘贴之外,我似乎无法正确使用语法,这使得代码难以阅读。请有人指出我正确的方向。

select att1, att2 from LONG EXPRESSION 
union
select att2, att1 from LONG EXPRESSION

我希望这样做

select att1, att2 union select att2, att1
from LONG EXPRESSION

或类似的东西

select att1, att2 from LONG EXPRESSION X
union
select att2, att1 from X

非常感谢

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    在我的手机上,所以请原谅格式:)

    SELECT (CASE multiplier.ID WHEN 0 THEN src.att1 ELSE src.att2 END), 
           (CASE multiplier.ID WHEN 1 THEN src.att1 ELSE src.att2 END)
    FROM LONG_EXPRESSION src CROSS JOIN
         (SELECT 0 AS ID
          UNION ALL
          SELECT 1 AS ID
         ) multiplier
    

    【讨论】:

      【解决方案2】:

      您正在寻找一个公用表表达式,即 CTE:

      with t as (
          select att1, att2
          from LONG EXPRESSION 
         )
      select t.att1, t.att2
      from t
      union all
      select t.att2, t.att1
      from t;
      

      请注意,我使用了union all 而不是union。这是可取的 - 除非您有意承担消除重复的开销。

      【讨论】:

      • 不知道Sqlite 支持 CTE,但我更喜欢普通的 UNION DML。 +1 CTE 方法
      • 我使用的 Sqlite 没有语法“with”,它给出了错误,但感谢 CTE 的提示。了解它绝对有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      相关资源
      最近更新 更多