sql - 我怎么能 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)
解决方案
你可以这样做:
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。
我需要更多☕☕才能知道为什么...
推荐阅读
- c++ - 非静态成员引用必须相对于特定对象
- ios - NSAttributedString 是跨平台的吗?
- linux - 根据性别将名称文件拆分为两个文件
- firebase - 使用 Query 类在 Firestore 中获取非空子集合
- module - 这里不需要一个名为“instance_type”的参数......在其他意外参数中
- arm - 在代码生成期间将 CMSIS 5.7 与 STM CubeIDE 一起使用时出现奇怪的错误消息
- ios - 在数组的单元格中显示图像
- javascript - 循环中的 Vue 自定义事件
- c# - 如何在没有端点的情况下使用属性路由?
- .net - 由于相对路径,在 Docker 容器中运行 dotnet 在 Linux 上失败