sybase - 如何在 Sybase 中左内连接两个查询?
问题描述
我有两个应该连接在一起的查询。这是我的查询1:
SELECT
t1.rec_id,
t1.category,
t1.name,
t1.code,
CASE
WHEN t1.name= 'A' THEN SUM(t1.amount)
WHEN t1.name = 'D' THEN SUM(t1.amount)
WHEN t1.name = 'H' THEN SUM(t1.amount)
WHEN t1.name = 'J' THEN SUM(t1.amount)
END AS Amount
FROM Table1 t1
GROUP BY t1.name, t1.rec_id, t1.category, t1.code
查询 1 产生这组结果:
Rec ID Category Name Code Amount
1 1 A MIX 70927.00
1 3 D MIX 19922.00
1 2 H MIX 55104.00
1 4 J MIX 76938.00
然后我有查询2:
SELECT
CASE
WHEN t2.category_id = 1 THEN SUM(t2.sum)
WHEN t2.category_id = 2 THEN SUM(t2.sum)
WHEN t2.category_id = 3 THEN SUM(t2.sum)
WHEN t2.category_id = 4 THEN SUM(t2.sum)
END AS TotalSum
FROM Table2 t2
INNER JOIN Table1 t1
ON t1.amnt_id = t2.amnt_id
AND t2.unique_id = @unique_id
GROUP BY t2.category_id
查询 2 的结果集是这样的:
TotalSum
186013.00
47875.00
12136.00
974602.00
我只需要这个结合了查询 1 和查询 2 的结果集:
Rec ID Category Name Code Amount TotalSum
1 1 A MIX 70927.00 186013.00
1 3 D MIX 19922.00 47875.00
1 2 H MIX 55104.00 12136.00
1 4 J MIX 76938.00 974602.00
如您所见,table 1
和之间存在联系table 2
。这种联系是amnt_id
。但是,我尝试LEFT INNER JOIN
在查询 1 上进行操作,然后简单地使用相同的逻辑case statement
来获得表 2 的总和。不幸的是,我使用的 Sybase 版本不支持左内连接。我想知道是否还有其他方法可以加入这两个查询?谢谢
解决方案
我想知道 CASE 语句在第一个查询中是否有意义,因为它在每一行中求和。除了 A、D、H、J 之外,名称列是否还有其他值?如果不是,您可以将 CASE 语句更改为SUM(t1.amount) AS Amount
. 此外,第一个查询中的 GROUP BY 对我来说似乎是可疑的:您按记录 id 列进行分组 - 这意味着您根本没有分组,而是返回每一行。如果这是您真正想要的,您可以完全省略 SUM 并返回纯金额列。
据我了解您的问题和数据结构:Table2 中的值是类别总和,Table1 中的值是子集。您想在单个金额旁边查看表 1 中每个类别的类别总和吗?
您通常会使用 CTE(公用表表达式,“WITH 子句”),但 ASE 不支持 CTE,因此我们必须使用连接。我在我的 SQL Anywhere 数据库中重新创建了您的表,并将这个示例放在一起。简而言之:两个查询都是外部查询中的子查询,并且在类别 ID 上保持连接:
SELECT *
FROM
(
SELECT
t1.rec_id,
t1.category,
t1.name,
t1.code,
CASE
WHEN t1.name= 'A' THEN SUM(t1.amount)
WHEN t1.name = 'D' THEN SUM(t1.amount)
WHEN t1.name = 'H' THEN SUM(t1.amount)
WHEN t1.name = 'J' THEN SUM(t1.amount)
END AS Amount
FROM Table1 t1
GROUP BY t1.rec_id, t1.name, t1.category, t1.code
) AS t1
LEFT JOIN
(
SELECT category_id, SUM(sum) FROM
table2
GROUP BY category_id
) AS totals(category_id, total_sum)
ON totals.category_id = t1.category;
这个查询给了我:
Rec ID Category Name Code Amount Category_id total_sum
2 3 D MIX 19922.00 3 47875.00
3 2 H MIX 55104.00 2 12136.00
1 1 A MIX 70927.00 1 186013.00
4 4 J MIX 76938.00 4 974602.00
您肯定需要对其进行一些调整,包括您的t2.unique_id列(我从您的查询中无法理解),但这是解决 ASE 缺少的 CTE 功能的一种实用方法。
顺便说一句:它要么是INNER JOIN
(仅来自两个表的相应记录)要么是LEFT (OUTER) JOIN
(全部来自左侧,仅来自右表的相应记录)但 aLEFT INNER JOIN
没有意义。
推荐阅读
- math - 添加 8 位有符号幅度二进制数 - 二进制算术
- java - 如何插入二维数组?
- python - 如果使用votingclassifier() 进行集成时投票相等怎么办?
- javascript - 如何在下拉列表中设置默认值,但仍然可以使用 JavaScript/JQuery 更改选择
- laravel - 单独的用户登录都表现为一个用户?
- asp.net-core - 在 Bootstrap 中更改 _LoginPartial 的媒体断点
- curl - 为什么我的基于 Netty 的服务器对 curl HTTP/2 先验知识请求和 vegeta -h2c 请求的响应不同?
- powershell - 在 Google Backup and Sync 文件夹中运行 PowerShell
- dart - NNBD:String 和 Null 的最小上限
- sql - 查询多次返回同一行