【问题标题】:How to repeat sections of a SQL query across UNIONs? (DRY in SQL)如何跨 UNION 重复 SQL 查询的部分? (SQL 中的 DRY)
【发布时间】:2011-12-28 19:01:43
【问题描述】:

我有一个查询,它返回三个 UNION 查询的结果。每个查询都有一个冗长的选择语句。 select 语句的某些部分如下所示:

coalesce(a.fact1,'Fact1'),
coalesce(b.fact1,'Fact2')
...

from/join 部分也很大

from table1 t1
join table2 t2 on t1.id = t2.t1_id
join table3 t3 on t2.id = t3.t2_id

等等。这些块中的每一个在所有三个 SELECT 语句中都以相同的方式重复。

我想知道是否有办法将那段代码(字段名称块或连接语句块)放入可以在一行中引用它们的地方。有点像迷你视图/功能,但只是作为文本替换。这样,我可以一次编辑这些内容,而不必单独编辑每个 select 语句的相关位。

这是在 MSSQL 中。有什么办法可以做我要解释的事情吗?


更新

select a.field1, b.field2, c.field3 
from table1 a 
  join table2 b on a.id = b.table1_id 
  join table3 c on b.id = c.table2_id 
where cond1 = 'Pos Condition' 
  AND cond2 = 'Test' 

union

select a.field1, b.field2, d.field3 
from table1 a 
  join table2 b on a.id = b.table1_id 
  join table3 c on b.id = c.table2_id 
  join table4 d on c.id = d.table3_id 
where cond1 = 'Pos Condition' 
  AND cond2 = 'Second Type of Result' 

每个字段中的数据会根据结果类型略有变化。我想把 from table1 -> join table3 部分放在一个单独的地方,这样我就可以重复插入它

【问题讨论】:

  • 澄清一下:我想做的就是用代表这些语句的变量/宏替换查询中的文本部分。
  • 谢谢!无法弄清楚如何降低格式:-)
  • 9年后的2021年还没有办法吗?

标签: sql sql-server tsql dry


【解决方案1】:

您在问题中给出的示例可以重构为 CTE 罚款。

WITH CTE
     AS (SELECT a.field1,
                b.field2,
                c.field3,
                c.id AS c_id
         FROM   table1 a
                JOIN table2 b
                  ON a.id = b.table1_id
                JOIN table3 c
                  ON b.id = c.table2_id
         WHERE  cond1 = 'Pos Condition') 
SELECT field1,
       field2,
       field3
FROM   CTE
WHERE  cond2 = 'Test'
UNION
SELECT field1,
       field2,
       d.field3
FROM   CTE c
       JOIN table4 d
         ON c_id = d.table3_id
WHERE  cond2 = 'Second Type of Result' 

【讨论】:

  • 谢谢马丁。这是有道理的。但是,我仍然想知道我的原始问题是否有答案,即如何在同一查询中复制 SQL 代码块。
  • @DNadel - 不是真的(除非你在sqlcmd 模式下运行)。您可以封装在视图中。或者使用动态 SQL。
【解决方案2】:

【讨论】:

  • 谢谢!我看过 CTE,但我认为它对于我正在寻找的东西来说有点太严格了。它似乎有点基于子查询,我正在寻找的是更简单的文本替换。你能推荐其他的吗?
  • 你能发布查询或它的缩写吗?
【解决方案3】:

你看过Common Table Expressions(CTE)吗?

【讨论】:

  • 谢谢,我看过 CTE。见上面的 cmets :-)
  • 我不喜欢这样,因为维护起来很麻烦,但您可能不得不使用动态 SQL。您必须在一个字符串中构建您的 SQL,这将允许您在多个地方使用相同的代码块而无需重写它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 2013-06-17
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多