gpt4 book ai didi

php - 将 SQL 查询转换为子查询

转载 作者:行者123 更新时间:2023-11-29 12:56:13 25 4
gpt4 key购买 nike

我知道奇怪的请求。但比起我换裤子,我的客户更喜欢改变主意。以下是我的 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

p.s C.customer_ID = O.order_No 是将客户链接到订单的内容

TL;博士来自@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,其次,您要返回两件事,这是不行的 - 您无法将单个客户编号与具有两列的列表相匹配 - 考虑在程序代码中执行此操作 - 您不能说 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

这是一个 fiddle :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 上连接。

关于php - 将 SQL 查询转换为子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24026207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com