如何在 Sybase 中左内连接两个查询?

How to Left Inner Join two queries in 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 1table 2 之间存在联系。该连接是 amnt_id。但是,我尝试在查询 1 上执行 LEFT INNER JOIN,然后简单地使用与 case statement 相同的逻辑来获取 table 2 的总和。不幸的是,我使用的 Sybase 版本不支持 Left Inner Join .我想知道是否有其他方法可以加入这两个查询?谢谢

我想知道 CASE 语句在第一个查询中是否有意义,因为它在每一行中求和。除了 A、D、H、J 之外,name 列是否还有其他值?如果不是,您可以将 CASE 语句更改为 SUM(t1.amount) AS Amount。此外,第一个查询中的 GROUP BY 对我来说似乎很可疑:您正在按记录 id 列分组 - 这意味着您根本没有分组,而是 return 每行。如果那是您真正想要的,您可以完全省略 SUM,只需 return 金额列。

据我了解您的问题和您的数据结构:表 2 中的值是一种 类别总和 ,而表 1 中的值是子集。您想在单笔金额旁边查看表 1 中每个类别的类别总和吗?

您通常会使用 CTE(常见 table 表达式,"WITH clause")但 ASE 不支持 CTE,因此我们必须使用联接。我在我的 SQL Anywhere 数据库中重新创建了您的 tables 并将这个示例放在一起。简而言之:两个查询都是外部查询中的子查询,并且在类别 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(只有来自 table 的相应记录),要么是 LEFT (OUTER) JOIN(全部来自左侧,只有来自右侧的相应记录 table) 但 LEFT INNER JOIN 毫无意义。