在一个表中如何根据订单号查询订单,用sql语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在一个表中如何根据订单号查询订单,用sql语句相关的知识,希望对你有一定的参考价值。

订单表:order

包含字段: id,orderNo,amount
中文意思:序列,订单号,金额
查询语句:
select * from order where orderNo = '订单编号'
因为编号是字符串类型,所以需要加单引号哦
参考技术A Select * from 订单 where 订单号='XXXXX'

SQL Server - Exists 的替代方案(子查询太多)

【中文标题】SQL Server - Exists 的替代方案(子查询太多)【英文标题】:SQL Server - Alternative to Exists (too many subqueries) 【发布时间】:2018-09-20 16:11:42 【问题描述】:

我正在寻找一种方法来提高具有太多现有链接子查询的查询的性能。

我的问题是我有一个订单明细表,其中对于订单的每个项目,都有一个特定的类别(存储在另一个表中,但现在无关紧要)。

我必须根据这些类别的不同组合来检测特定的“组”订单: - A 组:商品类别为 13 + 15 + (66, 67, 68, 69) 中的任何一个的订单 商品类别为 77 + 78 + (66, 67, 68, 69, 71, 71) 中的任何一个的订单

到目前为止,我所做的是使用链接存在的 HUGE 查询来查找满足该条件的订单,但这是一场性能噩梦。

我希望有更好的方法来做到这一点,因为我的表有数百万条记录...

非常感谢!!!

【问题讨论】:

您的查询范围很广,我不清楚请更新您的问题并添加适当的数据示例.. 预期结果和您的代码示例.. 【参考方案1】:

我会使用group byhaving

select order_id
from order_details od
group by order_id
having sum(case when category = 13 then 1 else 0 end) > 0 and  -- at least one 13
       sum(case when category = 15 then 1 else 0 end) > 0 and  -- at least one 15
       sum(case when category in (66, 67, 68, 69) then 1 else 0 end) > 0  -- at least one of these

这很容易扩展。所以对于第二组:

having (sum(case when category = 13 then 1 else 0 end) > 0 and  -- at least one 13
        sum(case when category = 15 then 1 else 0 end) > 0 and  -- at least one 15
        sum(case when category in (66, 67, 68, 69) then 1 else 0 end) > 0    
       ) or
       (sum(case when category = 77 then 1 else 0 end) > 0 and  -- at least one 13
        sum(case when category = 78 then 1 else 0 end) > 0 and  -- at least one 15
        sum(case when category in (66, 67, 68, 69, 71, 71) then 1 else 0 end) > 0    
       ) 

【讨论】:

我做了一个快速测试,它看起来就像一个魅力,简单而且非常快!非常感谢您的帮助和创造性的解决方案!【参考方案2】:

目前尚不清楚您的数据库的结构,但您可以尝试类似的方法:

SELECT DISTINCT
       orders.order_id AS group_a_order
FROM   orders
JOIN   order_details od13
  ON   orders.order_id = od13.order_id
 AND   od13.category = 13
JOIN   order_details od15
  ON   orders.order_id = od15.order_id
 AND   od15.category = 15
JOIN   order_details od6x
  ON   orders.order_id = od6x.order_id
 AND   od6x.category IN (66, 67, 68, 69)

这将返回所有具有: - 至少 1 个第 13 类的详细信息 - 至少 1 个第 16 类的详细信息 - 至少 1 个类别 66、67、68 或 69 的详细信息

【讨论】:

这可能需要更长的时间才能运行。真正的 JOIN 将扫描整个表以查找所有可能的匹配项; WHERE EXISTS 扫描直到找到第一个匹配项,然后评估为 TRUE 并继续前进。最初的方法可能已经是最有效的方法,即使它看起来需要很长时间才能运行。 感谢您的回答。正如@t***side 指出的那样,我使用存在来避免全表扫描,因此使用 JOIN 可能不是一个好的选择。 如前所述,我不知道表格的结构,但我想您在 order_details.order_id (应该是 FK)上有一个索引。在这种情况下,没有全表扫描,而是索引扫描

以上是关于在一个表中如何根据订单号查询订单,用sql语句的主要内容,如果未能解决你的问题,请参考以下文章

在“订单查询”表格中输入编码,怎么把“商品信息”表中对应的品名、规格、单价引用到“订单查询”表中?

用select语句将两个表合成为一个表

【写SQL语句】按照用户统计对应订单数和订单总金额?

SAP系统中如何根据一个订单号,查询所有在这订单中所消耗的物料

如何根据总订单价值和邮政组获取报告

sql这个语句怎么写条件,小于2010-4-1的订单日期