2017-02-10 3 views
1

У меня есть запрос на SQL, который является объединением нескольких таблиц, она возвращается повторяющиеся строки и после нескольких часов прохождения этого не может узнать, где его будет неправильноSQL Server Запрос возвращения повторяющихся строк

SELECT 
    StkItem.iUOMStockingUnitID, 
    _etblUnits1.cUnitCode as 'parkSize', 
    _etblUnits2.cUnitCode as 'quantitySize', 
    InvNum.fInvTotExclForeign, 
    [_btblInvoiceLines].*, 
    [_rtblCountry].cCountryName, 
    [CurrencyHist].fBuyRate, 
    Vendor.Name, 
    InvNum.OrderDate, 
    InvNum.InvNumber 
FROM 
    [dbo].[_btblInvoiceLines] 
LEFT JOIN 
    StkItem ON StkItem.StockLink = [_btblInvoiceLines].iStockCodeID 
LEFT JOIN 
    _etblUnits as _etblUnits1 ON _etblUnits1.idunits = StkItem.iUOMDefSellUnitID 
LEFT JOIN 
    _etblUnits as _etblUnits2 ON _etblUnits2.idunits = StkItem.iUOMStockingUnitID 
LEFT JOIN 
    InvNum ON iInvoiceID = AutoIndex 
LEFT JOIN 
    Vendor ON Vendor.DCLink = InvNum.AccountID 
LEFT JOIN 
    [_rtblCountry] ON [_rtblCountry].idCountry = Vendor.iCountryID 
LEFT JOIN 
    [CurrencyHist] ON InvNum.ForeignCurrencyID = [CurrencyHist].iCurrencyID 
WHERE 
    OrderNum = '' 
    AND [CurrencyHist].iCurrencyID = (SELECT TOP 1 iCurrencyID 
             FROM [CurrencyHist] 
             WHERE iCurrencyID = InvNum.ForeignCurrencyID 
             ORDER BY idCurrencyHist DESC) 

Вот и всякая помощь будет очень признательна, заблаговременно

+0

'ORDER BY' в вложенном запросе работает? –

+4

Удалите соединения один за другим, пока не исчезнут лишние строки. Тогда вы знаете, где проблема. –

+0

проблема возникает, когда я присоединяюсь к таблице currencyhist – lulliezy

ответ

2

От ваших предыдущих комментариев Проблема возникает, когда вы присоединяетесь к [CurrencyHist]. Из имени, кажется, это таблица истории, поэтому для каждой валюты должно быть несколько строк в виде истории. Чтобы устранить повторяющиеся строки, вы должны присоединиться к последней обновленной записи для конкретной валюты. Таким образом, ваш запрос может быть как ниже,

SELECT StkItem.iUOMStockingUnitID, 
      _etblUnits1.cUnitCode as 'parkSize', 
      _etblUnits2.cUnitCode as 'quantitySize', 
      InvNum.fInvTotExclForeign, 
      [_btblInvoiceLines].*, 
      [_rtblCountry].cCountryName, 
      [CurrencyHist].fBuyRate, 
      Vendor.Name, 
      InvNum.OrderDate, 
      InvNum.InvNumber 
    FROM [dbo].[_btblInvoiceLines] 
    LEFT JOIN StkItem ON StkItem.StockLink = [_btblInvoiceLines].iStockCodeID 
    LEFT JOIN _etblUnits as _etblUnits1 ON _etblUnits1.idunits = StkItem.iUOMDefSellUnitID 
    LEFT JOIN _etblUnits as _etblUnits2 ON _etblUnits2.idunits = StkItem.iUOMStockingUnitID 
    LEFT JOIN InvNum ON iInvoiceID = AutoIndex 
    LEFT JOIN Vendor ON Vendor.DCLink = InvNum.AccountID 
    LEFT JOIN [_rtblCountry] ON [_rtblCountry].idCountry = Vendor.iCountryID 
    LEFT JOIN (SELECT DENSE_RANK() over (partition by [CurrencyHist].iCurrencyID order by [CurrencyHist].LastUpdated desc) as rn,[CurrencyHist].iCurrencyID as 'iCurrencyID' 
    FROM [CurrencyHist] AS [CurrencyHist] 
    )[CurrencyHist] ON InvNum.ForeignCurrencyID = [CurrencyHist].iCurrencyID 
    and [CurrencyHist].rn=1 
WHERE OrderNum = '' AND 
[CurrencyHist].iCurrencyID = (SELECT TOP 1 iCurrencyID 
             FROM [CurrencyHist] 
             WHERE iCurrencyID = InvNum.ForeignCurrencyID 
             ORDER BY idCurrencyHist DESC) 

Примечание: Я предположил, что CurrencyHist таблица имеет LastUpdated с DateTime типа данных Колонка

+0

Я только что видел этот ответ после того, как обновил то, что вы предложили, и это сработало, спасибо – lulliezy

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