Два запроса в одной таблице результатов? - PullRequest
0 голосов
/ 13 сентября 2011

Я новичок в SQL Server 2008. Есть Proc. В этом Proc у меня есть два оператора select. Когда я выполняю свой Proc, я получаю результаты в двух таблицах, которые я принял. Но я хочу это вернуть в единую таблицу.

Мой Процесс -

 ALTER PROC [GetPaymentGateway]  
 @CompanyID VARCHAR(3),  
 @ChannelType varchar(15)=null
AS  

IF @ChannelType='BODC' OR @ChannelType='BO-DC'  
BEGIN
    SELECT [card_name], [card_type], [BODC_Amount], [BODC_Amount_Type], PGM.PG_Type FROM credit_card_master CCM
    INNER JOIN PaymentGateway_master PGM
    ON PGM.payment_gateway_code = CCM.payment_gateway_code  
    WHERE CCM.company_id = @CompanyID and CCM.disabled = '1'

    SELECT PGM.Payment_Gateway_Name, PGNBC.BODC_Charge_Amt, PGNBC.BODC_Charge_type, PGM.PG_Type 
    FROM PG_NetBanking_Charges PGNBC
    INNER JOIN PaymentGateway_master PGM
    ON PGM.payment_gateway_code = PGNBC.payment_gateway_code
    WHERE PGNBC.company_id = @CompanyID
END

IF @ChannelType='B2C' OR @ChannelType='ONLINE-DC'  
BEGIN
    SELECT [card_name], [card_type], [charge_amount], [B2C_Amount_type], PGM.PG_Type FROM credit_card_master CCM
    INNER JOIN PaymentGateway_master PGM
    ON PGM.payment_gateway_code = CCM.payment_gateway_code 
    WHERE CCM.company_id = @CompanyID and CCM.disabled = '1' 

    SELECT PGM.Payment_Gateway_Name, PGNBC.Online_DC_Charge_Amt, PGNBC.Online_DC_Charge_type, PGM.PG_Type 
    FROM PG_NetBanking_Charges PGNBC
    INNER JOIN PaymentGateway_master PGM
    ON PGM.payment_gateway_code = PGNBC.payment_gateway_code
    WHERE PGNBC.company_id = @CompanyID
END 

Подскажите пожалуйста, как это возможно ??

Заранее спасибо.

1 Ответ

2 голосов
/ 13 сентября 2011

Чтобы объединить два запроса в одну таблицу, вам нужна операция UNION . Это берет два набора результатов и в основном склеивает их вместе.
У Union мало ограничений, и самое важное - это то, чтобы в запросах было одинаковое количество столбцов.

В ваших запросах у вас выбрано различное количество столбцов, у запросов credit_card_master по 5 столбцов, а у запросов PG_NetBanking_Charges по 4 столбца.

Из того, что я вижу, я думаю, что столбец card_type из первого запроса не имеет эквивалента во втором запросе, поэтому вы можете переписать второй запрос как:

SELECT card_name, card_type, charge_amount, B2C_Amount_type, PGM.PG_Type 
  FROM ...
  WHERE ...
UNION
SELECT PGM.Payment_Gateway_Name, null, PGNBC.Online_DC_Charge_Amt,
       PGNBC.Online_DC_Charge_type, PGM.PG_Type
  FROM ...
  WHERE ...

Также обратите внимание, что столбцы в наборе результатов будут принимать имена столбцов из первого запроса, поэтому вы можете добавить псевдоним столбца, чтобы получить более осмысленное / общее имя для столбца. Кроме того, я обычно добавляю столбец «Источник», который позволяет мне отслеживать происхождение строки в объединении, поэтому мой окончательный запрос будет выглядеть так:

SELECT 1 as Source, card_name as Name, card_type as Type, 
       charge_amount as Ammount, B2C_Amount_type as AmmountType,
       PGM.PG_Type as PG_Type
  FROM ...
  WHERE ...
UNION
SELECT 2, PGM.Payment_Gateway_Name, null, PGNBC.Online_DC_Charge_Amt,
       PGNBC.Online_DC_Charge_type, PGM.PG_Type
  FROM ...
  WHERE ...

, и результат будет иметь столбцы Source, Name, Type, Ammount, AmmountType и PG_Type, где Source будет 1 для строк первого и 2 для строки из второго запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...