Как левое внутреннее соединение двух запросов в Sybase?

#sybase #sap-ase

#sybase #sap-ase

Вопрос:

У меня есть два запроса, которые следует объединить. Вот мой запрос 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, которую я использую, не поддерживает левое внутреннее соединение. Мне интересно, есть ли другой способ объединить эти два запроса? Спасибо

Комментарии:

1. Можете ли вы объяснить нам, что вы подразумеваете под «объединением» двух запросов, показав нам, каков ожидаемый результат?

2. @TimBiegeleisen Я обновил свой вопрос с желаемым результатом вывода. Спасибо.

Ответ №1:

Я задавался вопросом, имеет ли смысл оператор CASE в первом запросе, потому что он суммирует в каждой строке. Существуют ли другие значения для столбца name, кроме A, D, H, J? Если нет, вы можете изменить оператор CASE на SUM(t1.amount) AS Amount . Также ГРУППИРОВКА ПО в первом запросе кажется мне сомнительной: вы группируете по столбцу идентификатора записи — это означает, что вы вообще не группируете, а вместо этого возвращаете каждую строку. Если это то, чего вы действительно хотите, вы можете вообще не указывать СУММУ и просто вернуть столбец с чистой суммой.

Насколько я понял вашу проблему и вашу структуру данных: значения в Table2 являются своего рода суммами категорий, а значения в Table1 являются подмножествами. Вы хотели бы видеть сумму категории для каждой категории в Table1 рядом с отдельными суммами?

Обычно вы бы использовали CTE (обычное табличное выражение, «С предложением»), но ASE не поддерживает CTE, поэтому нам приходится работать с объединениями. Я воссоздал ваши таблицы в своей базе данных SQL Anywhere и собрал этот пример. В двух словах: оба запроса являются подзапросами во внешнем запросе и соединяются слева по идентификатору категории:

 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 (все слева, только соответствующие записи из правой таблицы), но LEFT INNER JOIN не имеет смысла.

Комментарии:

1. Оливер, спасибо тебе за твой отзыв. Я знаю, что некоторые столбцы не имеют смысла, но я использовал некоторые имена только для примера. Да, левое соединение имеет смысл, и это то, что я изменил в своем запросе. В Sybase есть некоторые ограничения, и мне пришлось воспользоваться вашим подходом, описанным выше. Спасибо.