2016-08-22 2 views
1

Я понятия не имею, почему это не работает, мой первый стол dbo.tsoSalesAnalysis имеет 699 строк за июль, и все, что я пытаюсь сделать, это ADD столбец добавления из dbo.[slSalesOrderTable] с простым соединением с использованием custKey в качестве эталона. Тем не менее, он дает мне все строки для другой таблицы, которая составляет более 400 000 строк. НУЖНО ТОЛЬКО ВЕРНУТЬ 699 Ряды + НОВЫЙ COLUMN (CustID)Присоединиться не отображает нужное количество строк

SELECT 
    t.ItemKey, 
    S.CustID, 
    t.PostDate, t.ReturnAmt, t.ReturnsQty, 
    t.SalesAmt, t.SalesQty, t.TranDate 
FROM 
    [dbo].[tsoSalesAnalysis] AS t 
INNER JOIN 
    [dbo].[slSalesOrderTable] AS s ON t.CustKey = s.CustKey 
WHERE 
    t.PostDate >= '2016-07-01' 
    AND t.CustKey = '58888' 
+1

Можете ли вы разместить образцы данных? – DVT

+10

Я не думаю, что вы понимаете, как работает JOINS, если у вас есть несколько строк в 'slSalesOrderTable' для каждого' custKey', тогда вы получите эти несколько строк в результате вашего соединения. – Lamak

+0

Я думал, что Left join будет решать это, но это не так. Как бы я это исправить? – Cesar

ответ

1

Если CustKey не является уникальным в tsoSalesOrdersTable, то мы ожидаем, что более чем 699 строк, которые будут возвращены.

В идеале у вас будет другая таблица, в которой есть CustKey в качестве столбца UNIQUE, чтобы найти значение CustId. При отсутствии этого вы можете получить одно значение из tsoSalesOrdersTable с помощью встроенного представления. Например:

SELECT t.ItemKey 
     , S.CustID 
     , t.PostDate 
     , t.ReturnAmt 
     , t.ReturnsQty 
     , t.SalesAmt 
     , t.SalesQty 
     , t.TranDate 
    FROM [dbo].[tsoSalesAnalysis] t 
    JOIN (-- inline view to return one row for CustKey 
      SELECT ms.CustKey 
       , MIN(ms.CustId) AS CustId 
      FROM [dbo].[slSalesOrderTable] ms 
      WHERE ms.CustKey= '58888' 
      GROUP BY ms.CustKey 
     ) s 
     ON s.CustKey = t.CustKey 
    WHERE t.PostDate >= '2016-07-01' 

Если заданное значение CustKey 58888 не появляется в slSalesOrderTable, то вид рядный будет возвращать нулевые строки. И это означает, что запрос вернет нулевые строки из-за внутреннего соединения.

Если вы решили использовать внешнее соединение, то вы также должны включить предикат на t.CustKey на внешний запрос.

+0

Привет, спасибо! Я исправил это прямо перед тем, как вы отправили ответ LOL, но у меня в значительной степени одно и то же. Отличное объяснение! – Cesar

-1

Предполагая, что у вас нет другого способа получить CustID, решение состоит в том, чтобы просто добавить ключевое слово DISTINCT в запрос.

Естественно, было бы лучше, если бы у вас была таблица поиска клиентов, отличная от таблицы заказа клиента, где это было бы необязательно.

+1

Использование DISTINCT может быть чрезмерно дорогостоящим. В нем также делается предположение об уникальности выражений из 't', так как DISTINCT сжимает« повторяющиеся »строки, что может быть нежелательно. (Кстати, я не ответил на этот вопрос. Я просто добавляю комментарий здесь, как помощь будущим читателям.) В некоторых случаях добавление DISTINCT является наиболее подходящим решением. В этом случае я бы избегал DISTINCT и использовал другой подход. – spencer7593

0

Это очень много ресурсов, но ваша база данных не видела больших размеров.

SELECT 
    t.ItemKey 
    ,t.PostDate 
    ,t.ReturnAmt 
    ,t.ReturnsQty 
    ,t.SalesAmt 
    ,t.SalesQty 
    ,t.TranDate 
    ,(SELECT TOP 1 s.CustID FROM [dbo].[slSalesOrderTable] s WHERE t.CustKey = s.CustKey) as CUSTID 
FROM [dbo].[tsoSalesAnalysis] as t 
WHERE t.PostDate >= '2016-07-01' and t.CustKey= '58888' 
+1

, это вызовет ошибку, если в 'slustesOrderTable' (который мы уже знаем) есть более одной строки на' custKey' (442), который вы уже знаете. – Lamak

+0

вы можете просто ограничить ее до 1 – Maviles

+1

, которой вы не являетесь – Lamak

Смежные вопросы