首页 > 解决方案 > 我怎么能 DRY 这个 SQL 其中 UNION ALL 两个类似的语句?

问题描述

我需要在两个不同的模式UNION上得到相同SELECT代码的结果。(示例如下。)但是每次我需要更改代码中的某些内容时,我都必须更改两次。我已经因为忘记在第二个中进行更改而被咬了SELECT。有没有办法将SELECT语句抽象为某种函数?

这是一个保存在 .sql 文件中的查询,我有时会运行该文件。我无权为数据库创建视图或函数。

SELECT a.column_a,
  b.column_b,
  c.column_c
FROM schema_A.table_a AS a,
  schema_A.table_b AS b,
  schema_A.table_c AS c
WHERE a.id_b = b.id
  AND b.id_c = c.id
  AND a.column_a LIKE 'something%'

UNION ALL

SELECT a.column_a,
  b.column_b,
  c.column_c
FROM schema_B.table_a AS a,
  schema_B.table_b AS b,
  schema_B.table_c AS c
WHERE a.id_b = b.id
  AND b.id_c = c.id
  AND a.column_a LIKE 'something%'

我希望能够做这样的事情:

FUNCTION something(@schema) AS (
  SELECT a.column_a,
    b.column_b,
    c.column_c
  FROM @schema.table_a AS a,
    @schema.table_b AS b,
    @schema.table_c AS c
  WHERE a.id_b = b.id
    AND b.id_c = c.id
    AND a.column_a LIKE 'something%'
)

SELECT something(schema_A)
UNION ALL
SELECT something(schema_B)

标签: sqlrdbmsdry

解决方案


你可以这样做:

SELECT a.column_a,
  b.column_b,
  c.column_c
FROM (select * from schema_A.table_a 
      union all
      select * from schema_B.table_a 
     ) AS a,
  (Select * from schema_A.table_b 
   union all
   Select * from schema_b.table_b 
  ) AS b,
  (select * from schema_A.table_c 
   union all
   select * from schema_B.table_c 
  ) AS c
WHERE a.id_b = b.id
  AND b.id_c = c.id
  AND a.column_a LIKE 'something%'

但这不会让生活更轻松......

编辑:我假设上述语句与原始查询具有相同的结果是错误的,请参阅DBFIDDLE

我需要更多☕☕才能知道为什么...


推荐阅读