【问题标题】:SQL: Determine the record count for 2 separate filter conditions in the execution of only 1 querySQL:在仅执行 1 个查询时确定 2 个单独的过滤条件的记录数
【发布时间】:2013-05-22 10:20:45
【问题描述】:

假设我有一个 BOOK 表。

采用这种结构:

create table BOOK (
  AUTHOR varchar2(100),
  TITLE  varchar2(100)
);

我想要做的是检查/(或计数,计数(*)= 1)是否存在作者='约翰史密斯'的书,以及是否存在由'约翰史密斯'撰写的书,以字母“T”。

我想出了两条 SQL 语句。

select count(1)
  from BOOK
 where AUTHOR = 'John Snow'
   and rownum = 1

select count(1)
  from BOOK
 where AUTHOR = 'John Snow'
   and TITLE like = 'T%'
   and rownum = 1

我的问题是:有没有一种方法可以让我知道是否存在符合这种标准的书(我需要知道是否有约翰·斯诺(John Snow)的书以及他是否写过书名以字母开头的书T') 通过仅执行 1 个查询?这样执行这 1 个查询会比执行上面的 2 个查询更快吗?谢谢!

【问题讨论】:

  • sorry 但是我不明白如果我还给你 1 你怎么知道是 John 写的书的数量还是 john 写的以 T 开头的书的数量?
  • 这样查询将返回 1 行 2 列。 I 列是 John Smith 所著的书籍数量,另一个是 John Smith 以“T”开头的书籍作者数量

标签: sql


【解决方案1】:

嗯,你可以把信息分成两列:

select (case when sum(case when AUTHOR = 'John Snow' then 1 else 0 end) > 0
             then 1
             else 0
        end) as AuthoredByJohnSnow,
       (case when sum(case when AUTHOR = 'John Snow' and Name like 'T%' then 1 else 0 end) > 0
             then 1
             else 0
        end) as AuthoredByJohnSnowBookT
from Book

您可以通过将AUTHOR = 'John Snow' 放在where 子句中来提高效率。这明确没有这样做,因此您可以轻松地在 select 中添加更多因素。

【讨论】:

    【解决方案2】:
    select
        SIGN(count(*)),
        SIGN(count(CASE WHEN TITLE like 'T%' THEN 1 ELSE NULL END)),
    from BOOK
    where AUTHOR = 'John Snow';
    

    【讨论】:

    • 当没有John Snow 时,我假设OP 期望0, 0。这使事情有点复杂。我在想同样的说法,但停在那里。最简单的可能是添加一个union 0, 0。至少,OP 只需以这种方式提供一次标准,但“它并不漂亮”。
    • 不应该将计数大小写更改为最大(并有一个分组)吗?
    • 没有group by时你会得到零。见stackoverflow.com/a/2552102/27535。也不需要MAX。这依赖于 COUNT 忽略 NULL。
    • @Ram:我现在明白了。使用 GROUP BY 的 COUNT 将始终按照 stackoverflow.com/a/2552102/27535 返回一行
    • 等等,这不是错误的吗,因为存在 rownum = 1 条件?让我们假设约翰史密斯撰写了两本书:“旭日”和“旭日之地”。由于条件只有 AUTHOR = 'John Snow' 且 rownum = 1,因此一旦找到 John Snow 撰写的书籍,它将停止获取更多记录。因此,如果它首先偶然发现“Rising Sun”,它会立即停止,并且只会返回 1、0,即使有一本书以“T”开头。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    相关资源
    最近更新 更多