Sql server 如何将此查询更改为使用联接(内部或左侧)而不是子查询来获得相同的结果
如何将此查询更改为使用联接(内部或左侧),而不使用子查询Sql server 如何将此查询更改为使用联接(内部或左侧)而不是子查询来获得相同的结果,sql-server,Sql Server,如何将此查询更改为使用联接(内部或左侧),而不使用子查询 SELECT * FROM External_Blk_Itm_Contracts ELC WHERE NOT EXISTS(SELECT NULL FROM [BUDCONTRACTS] c INNER JOIN BU
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'
未经测试(显然):
关于这一点,我最大的问题是为什么我们要使用名称字段加入ELC?ELC上没有TerminalID、CustomerID和CotractID等吗?我通过
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
我认为它应该表现得更好,因为左连接会降低效率,我想涉及的表的模式是什么?特别是主键和外键列?你能发布一个吗?我希望相同的查询与不带子查询的连接@TabAlleman Not duplicate的可能重复项相同
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