-1

How to change this query to use joins (inner or left) but not subquery

 SELECT * FROM   External_Blk_Itm_Contracts ELC
    WHERE
    NOT EXISTS(SELECT
                    NULL
                FROM        
                    [BUDCONTRACTS] c
                INNER JOIN 
                    BUDTERMINALS t on t.TerminalID = c.TerminalID  AND  t.MBFTERMINALNAME = ELC.TerminalName AND  c.CONTRACTNAME = ELC.ContractName 
                INNER JOIN 
                    BudCustomers ct on ct.CustomerId = c.CustomerId AND ELC.CustomerName = ct.LegalName
               )
                AND ELC.ContractName = '00-000'
user1030181
  • 1,995
  • 5
  • 26
  • 56

2 Answers2

1

Untested (obviously):

SELECT distinct
  ELC.* 
FROM
  External_Blk_Itm_Contracts ELC
LEFT JOIN  
  BUDCONTRACTS c on c.CONTRACTNAME = ELC.ContractName
LEFT JOIN 
  BUDTERMINALS t on t.TerminalID = c.TerminalID and t.MBFTERMINALNAME = ELC.TerminalName
LEFT JOIN 
  BudCustomers ct on ct.CustomerId = c.CustomerId and ELC.CustomerName = ct.LegalName
WHERE   
  c.CONTRACTNAME is NULL 
  and t.TerminalID is NULL
  and ct.CustomerID is NULL
  AND ELC.ContractName = '00-000'

My biggest question about this is why we're joining using name fields to ELC? Isn't there e.g. TerminalID, CustomerID and CotractID available on ELC?

W.Prins
  • 1,286
  • 1
  • 14
  • 22
0

I fixed this by

        SELECT ELC.* FROM External_Blk_Itm_Contracts ELC
        INNER JOIN BUDTERMINALS BT ON BT.MBFTERMINALNAME = ELC.TerminalName AND ELC.ContractName = '00-000' 
        INNER JOIN BudCustomers BCUST ON BCUST.LegalName = ELC.CustomerName
        LEFT JOIN BUDCONTRACTS BCON ON BCON.CONTRACTNAME = ELC.ContractName AND BCON.TERMINALID = BT.TERMINALID AND BCON.CUSTOMERID = BCUST.CustomerID  
        WHERE    BCON.CONTRACTID IS NULL
user1030181
  • 1,995
  • 5
  • 26
  • 56