Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL Server Query returning duplicate rows

I have a query of SQL that is a join of multiple tables, it is returning duplicate rows and after hours of going through it can't find out where its going wrong

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)

Here is the query, any help will be highly appreciated, thanks in advance

like image 644
lulliezy Avatar asked Aug 16 '26 17:08

lulliezy


1 Answers

From your previous comments, The problem is coming when you join [CurrencyHist]. From the name, it seems it's a history table and so must be having multiple rows as a history for each currency. To eliminate duplicate rows, you should join with the latest updated record for the particular currency. So, your query could be like below,

    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)

Note : I have assumed that CurrencyHist table has a LastUpdated with DateTime datatype Column

like image 83
Mit Bhatt Avatar answered Aug 19 '26 01:08

Mit Bhatt



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!