如何在 SQL Server 中连接两个 SQL 查询?
Posted
技术标签:
【中文标题】如何在 SQL Server 中连接两个 SQL 查询?【英文标题】:How to join two SQL queries in SQL Server? 【发布时间】:2021-12-30 05:22:36 【问题描述】:我有两个 SQL 查询,这是第一个:
SELECT Activity, SUM(Amount) AS "Total Amount 2009"
FROM Activities, Incomes
WHERE Activities.UnitName = ?
AND Incomes.ActivityId = Activities.ActivityID
GROUP BY Activity
ORDER BY Activity;
第二次查询:
SELECT Activity, SUM(Amount) AS "Total Amount 2008"
FROM Activities, Incomes2008
WHERE Activities.UnitName = ?
AND Incomes2008.ActivityId = Activities.ActivityID
GROUP BY Activity
ORDER BY Activity;
如何连接这两个 SQL 查询?
【问题讨论】:
Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSIJOIN
语法-92 SQL 标准(近 30 年前),不鼓励使用它
加入?向我们展示每个查询的一些示例结果,以及所需的组合结果。
为什么每年都有不同的收入表?有了一张普通的收入表,您就不会遇到这个问题。
【参考方案1】:
我想它会对你有所帮助。如果您的 RDBMS Oracle DB 使用 NVL 而不是 ISNULL。 使用 FULL JOIN 因为如果您在一个查询中有 Activity 并且此 Activity 在其他查询中不存在,您可能会丢失此 Activity。 '''SQL
SELECT
ISNULL(T1.Activity,T2.Activity) AS Activity
,ISNULL(TotalAmount2009,0) AS TotalAmount2009
,ISNULL(TotalAmount2008,0) AS TotalAmount2008
FROM
(select Activity, SUM(Amount) as "TotalAmount2009"
from Activities, Incomes
where Activities.UnitName = ? AND
Incomes.ActivityId = Activities.ActivityID
GROUP BY Activity) T1
FULL JOIN
(select Activity, SUM(Amount) as "TotalAmount2008"
from Activities, Incomes2008
where Activities.UnitName = ? AND
Incomes2008.ActivityId = Activities.ActivityID
GROUP BY Activity) T2
ON T1.Activity=T2.Activity
'''
【讨论】:
今日提示:COALESCE()
- NVL、ISNULL 等的 ANSI/ISO 方式。【参考方案2】:
使用下面的查询来连接两个查询。
SELECT t1.Activity, t1."Total Amount 2009", t2."Total Amount 2008" FROM(query1) as t1, (query2) as t2 WHERE t1.Activity = t2.Activity
【讨论】:
以上是关于如何在 SQL Server 中连接两个 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章
如何连接两个等效表,它们是 SQL Server 中先前递归选择的结果