簡體   English   中英

將SQL查詢轉換為子查詢

[英]Convert SQL query to a subquery

我知道奇怪的要求。 但是我的客戶比我換褲子更喜歡改變主意。 以下是我的SQL查詢的摘要:

SELECT C.f_Name, C.l_Name, O.order_No, O.order_Date
FROM Customers AS C, Orders AS O,
WHERE C.customer_ID = O.order_No 

我想將其轉換為子查詢。 為什么? 因為我要向該查詢添加更多的噸,因此我迫切需要在子查詢的世界中起步。 我試圖這樣做:

SELECT C.f_Name, C.l_Name
FROM Customers AS C
WHERE C.customer_ID IN (SELECT O.order_No, O.order_Date FROM Orders AS O WHERE C.customer_ID = O.order_No)

但是我顯然不理解這個概念,因為它不起作用。 請幫我堆高車!

樣本數據集(非常小)

Customers Table

customer_ID | f_Name | l_Name
10            Akira    Dawson
11            Charlie  Frantooie

Orders Table

order_No | order_Date | 
10         2014-04-11 09:04:36

通過這個小片段,Akira已下達命令,但Charlie尚未下訂單。 我正在使用PHP進行CSV導出,無論如何我都需要顯示所有記錄。 所以我的預期結果是

Customer_ID | f_Name | l_Name | order_No | order_Date
10            Akira    Dawson     10       2014-04-11
11            Charlie  Frantooie  NA          NA 

ps C.customer_ID = O.order_No是將客戶鏈接到訂單的內容

TL; DR來自@Turophile的答復

SELECT C.customer_ID, C.f_Name, C.l_Name, O.order_No, O.order_Date
FROM Customers AS C
LEFT OUTER JOIN Orders AS O
ON C.customer_ID = O.order_No

好,讓我分解一下您的榜樣,以期希望我能增加您的知識和了解。

SELECT C.f_Name, C.l_Name
FROM Customers AS C
WHERE C.customer_ID IN (
  SELECT O.order_No, O.order_Date 
  FROM Orders AS O 
  WHERE C.customer_ID = O.order_No
  )

這是一個開始,但您必須了解WHERE子句中的子選擇不會為結果提供值-它僅限定了主選擇中包括哪些行。

請注意,您的WHERE子句具有C.customer_ID IN ,這意味着子選擇必須返回一組customer_ID值。 現在,可以將它們稱為其他名稱,但必須是customer_ID 在您的示例中,您將返回O.order_No, O.order_Date ,這在兩種方式上都是錯誤的:首先,兩種方法似乎都不包含customer_ID ;其次,您將返回兩件事,這是O.order_No, O.order_Date -您可以不能將單個客戶編號與具有兩列的列表匹配-考慮在程序代碼中執行此操作-您不能說int == (Object){int,int}

如果要在結果集中使用這些值,則需要在主(外部)查詢中選擇它們,因此它們需要以某種方式到達那里,這意味着子查詢可能不是答案-子查詢是WHERE子句的一部分用於完善結果集,以排除一些不需要的數據。

嘗試這樣的事情:

SELECT C.f_Name, C.l_Name, order_No, O.order_Date
FROM Customers AS C
LEFT OUTER JOIN Orders AS O
ON C.customer_ID = O.customer_ID

但是如果您必須使用子選擇,並且假設您不需要返回訂單明細,請執行以下操作:

SELECT C.f_Name, C.l_Name
FROM Customers AS C
WHERE C.customer_ID IN (SELECT O.customer_ID  FROM Orders)

還請注意,通常一個客戶可能有很多訂單,因此您必須允許這樣做。 希望對您有所幫助。 詢問是否需要。


編輯根據添加到問題的示例,我認為正確的查詢將是:

SELECT C.customer_ID, C.f_Name, C.l_Name, O.order_No, O.order_Date
FROM Customers AS C
LEFT OUTER JOIN Orders AS O
ON C.customer_ID = O.order_No

這是一個小提琴: http ://sqlfiddle.com/#!2/ ca441/1

請注意,在名為Order_No的列中有客戶編號是不好的-為什么它不是Customer_ID? 為了說明,目前沒有“訂單號”, order_No列包含customer_ID值。 客戶下多筆訂單會怎樣? 這是一個示例: http : //sqlfiddle.com/#!2/297e1/1 ,如您所見,每個客戶的所有訂單的“訂單號”都是相同的。 您的訂單表需要另外一列,添加了customer_ID ,然后order_No可以是每個訂單的唯一鍵。 然后,這也很明顯,兩個表應該在customer_ID上聯接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM