Использование объединения для возврата одной строки из 2 таблиц

#sql-server #tsql #union

#sql-server #tsql #объединение

Вопрос:

Я хочу объединить 2 таблицы в 1 и вернуть их в 1 строку для каждого уникального идентификатора

 
SELECT  
     try_convert(nvarchar(3),  StockRec.CustNo)  AS [CustNo]
    ,try_convert(nvarchar(3),  StockRec.LocationNo) AS [LocationNo]
    ,try_convert(nvarchar(8),  StockRec.ItemNo)      AS [ItemNo]
    ,try_convert(nvarchar(20), StockRec.Location)       AS [Location]
    ,try_convert(nvarchar(20), StockRec.Container)   AS [Container]
     FROM
(       SELECT  
                  CustNo
                , LocationNo
                , ItemNo
                , Location
                , Container
        FROM CustPurchases
UNION ALL
        SELECT
                  CustNo
                , LocationNo
                , ItemNo
                , Location
                , Container
        FROM CustomerSales
)StockRec

  

CustPurchases выглядит так

CustPurchases

и CustomerSales выглядит так

Продажи клиентов

Однако, когда я запускаю запрос, я получаю 10 строк обратно вместо 5

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

1. Согласен с ответом Гордона. В случае возникновения путаницы в объединении и объединении, подумайте об этом так: объединение объединит результаты или «сложит» их. Объединение объединит результаты (вообще говоря, в зависимости от запроса) и в некотором смысле получит «комбинированный» набор результатов.

2. Пожалуйста, прочтите это для получения нескольких советов по улучшению вашего вопроса.

Ответ №1:

Если вы хотите пять рядов, я думаю, вы хотите join :

 select . . .   -- the columns you want
from CustPurchases cp join
     CustSales cs
     on cs.custno = cp.custno;
  

Ответ №2:

Попробуйте использовать агрегирование с помощью group by

 SELECT  
    CustNo
    ,LocationNo
    ,ItemNo
    ,max(Location)
    ,max(Container)
     FROM
(       SELECT  
                  CustNo
                , LocationNo
                , ItemNo
                , Location
                , Container
        FROM CustPurchases
UNION ALL
        SELECT
                  CustNo
                , LocationNo
                , ItemNo
                , Location
                , Container
        FROM CustomerSales
)StockRec group by CustNo
    ,LocationNo
    ,ItemNo
  

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

1. если у меня есть дополнительные столбцы? цена, уплаченная в CustPurchases, будет равна нулю в custSales, другим столбцом будет цена покупки в CustSales, которая будет равна нулю в CustPurchases, и в верхнем выборе мы рассчитаем цену покупки — уплаченную цену. Даст ли сумма (цена покупки — оплаченная цена) правильный результат?