【问题标题】:SQL only show orders with one order row. if more rows don display anythingSQL 只显示一个订单行的订单。如果更多行不显示任何内容
【发布时间】:2021-12-13 12:52:19
【问题描述】:

我正在尝试在订单行中搜索包含一篇特定文章的订单,但如果有不止一行,我不想看到任何行。

这是两个订单的示例,我只想获得一个结果。订单9891026有两排,9891025只有一排。

    select  order_no, line_no
    from customer_order_line
    where order_no in('9891026','9891025')

结果

order_no line_no
9891026 1
9891026 2
9891025 1

我只想得到

order_no line_no
9891025 1

我不知道如何对此进行正确的查询。

【问题讨论】:

  • Edit问题并提供minimal reproducible example,即涉及的表或其他对象的CREATE语句(粘贴文本,不要使用图像,不要链接到外部站点),INSERT 用于示例数据 (dito) 的语句以及带有表格文本格式的示例数据的所需结果。同时标记您的 DBMS。
  • @stickybit 认真的吗?
  • @SalmanA:是的,认真的。

标签: sql select count exclude


【解决方案1】:

一种方法是检查订单exists 的 line_no 是否大于 1:

select ol.order_no, ol.line_no
from customer_order_line ol
where ol.order_no in (9891026, 9891025)
and not exists (
  select * from customer_order_line x
  where x.order_no = ol.order_no and x.line_no > 1
);

【讨论】:

  • 谢谢,当我使用这个查询时,我得到“无效号码”。
  • 我在最后一个例子中得到了答案,它是 varchar,所以我在这里做了同样的编辑 (9891026, 9891025) --> ('9891026', '9891025') 谢谢!这很好用!
【解决方案2】:

或者,您可以使用GROUP BY 并使用HAVING 来确保只有一行。

select ol.order_no, min(ol.line_no)
from customer_order_line ol
where ol.order_no in ('9891026', '9891025')
group by ol.order_no
having count(*) = 1

【讨论】:

  • 谢谢,当我使用这个查询时,我得到“无效号码”。和第一个一样。
  • @JimmyOlsson,列 order_no 数据类型? (我假设它是整数,但也许它是 varchar?我已经编辑了查询,所以它现在应该可以工作了。)
  • 是的,现在可以了!谢谢!
【解决方案3】:

首先找到单行订单号order_no(子查询),然后仅从具有这些订单号的订单中进行选择。请注意,连接查询(虽然可能更难阅读)可能更有效。

select * 
from customer_order_line 
where order_no in
(
 select order_no 
 from customer_order_line
 group by order_no 
 having count(*) = 1
) -- this is the list of single-item orders
and order_no in (9891026,9891025) -- this is the list of target orders

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-29
    • 2020-10-18
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多