Optimization

如何從一個表中獲取所有記錄並查看它們是否在另一個沒有子查詢的情況下使用

  • September 25, 2017

我正在嘗試編寫一個 SQL 語句,從一個表中提取所有記錄並查看它們是否在另一個表中使用。SQL 不是我最擅長的語言,所以我確信這是一個非常簡單的查詢。這是我的兩張表:

tblOrderContracts
--------------------------------------
OrderContractID           | bigint
OrderID                   | bigint
UserContractID            | bigint
UserName                  | varchar
OrderContractDateCreated  | datetime
OrderContractStatus       | varchar



tblUserContracts
-------------------------------------
UserContractId            | bigint
UserName                  | varchar
UserContractName          | varchar
UserContractFileName      | varchar
UserContractDateCreated   | datetime
UserContractStatus        | varchar

使用者可以將任意數量的合約應用於訂單,所以我需要做的是獲取所有合約的列表,並查看它們是否在特定訂單中使用。現在,我使用子查詢來完成工作,但如果不需要,我不喜歡使用子查詢。

SELECT uc.UserContractId, uc.UserContractName,
(SELECT oc.OrderID FROM tblOrderContracts as oc WHERE uc.UserContractID = 
oc.UserContractID AND oc.OrderID = 466 AND OrderContractStatus = 
'Active')
FROM tblUserContracts as uc
WHERE uc.UserName = 'vandel212' AND UserContractStatus = 'Active'

理想情況下,我希望得到一個如下所示的結果集,如果 OrderID 列中的值為 NULL,則表示未使用它:

UserContractId  |  UserContractName  |  OrderID
-----------------------------------------------
36              |  test              |  466
37              |  test2             |  NULL
38              |  test3             |  NULL

任何幫助是極大的讚賞。謝謝!

您可以使用 aLEFT JOIN來獲得相同的結果。注意WHERE子查詢的條件是如何移動到連接ON子句的:

SELECT 
   uc.UserContractId, 
   uc.UserContractName,
   oc.OrderID
FROM 
   tblUserContracts AS uc
   LEFT JOIN tblOrderContracts AS oc 
   ON  uc.UserContractID = oc.UserContractID 
       AND oc.OrderID = 466 
       AND oc.OrderContractStatus = 'Active'
WHERE 
   uc.UserName = 'vandel212' 
   AND uc.UserContractStatus = 'Active' ;

引用自:https://dba.stackexchange.com/questions/186781