相关疑难解决方法(0)

SQL:基于列值的Count()

我有一张表如下:

CallID   | CompanyID  | OutcomeID
----------------------------------
1234     | 3344       | 36
1235     | 3344       | 36
1236     | 3344       | 36
1237     | 3344       | 37
1238     | 3344       | 39
1239     | 6677       | 37
1240     | 6677       | 37
Run Code Online (Sandbox Code Playgroud)

我想创建一个SQL脚本来计算Sales结果的数量和所有其他尝试的数量(任何<> 36),类似于:

CompanyID  | SalesCount  | NonSalesCount
------------------------------------------
3344       | 3           | 1
6677       | 0           | 2
Run Code Online (Sandbox Code Playgroud)

有没有办法做COUNT()包含像COUNT这样的条件(CallID WHERE OutcomeID = 36)?

sql count

19
推荐指数
2
解决办法
7万
查看次数

将空值计数为唯一值

我需要在列上计算不同的值,例如:

Hours
1
1
2
null
null
null
Run Code Online (Sandbox Code Playgroud)

结果必须是:3.我的查询是:

select count(distinct hour) from hours;
Run Code Online (Sandbox Code Playgroud)

但它返回:2.我也测试过:

select count(*) from hours group by hour
Run Code Online (Sandbox Code Playgroud)

但它返回三行:

(1) 3
(2) 2
(3) 1
Run Code Online (Sandbox Code Playgroud)

如何将空值计算为1值并使用distinct来避免计算重复值?

我正在学习高级SQL,他们想要我对所有解决方案的这些要求:

尝试最小化解决查询所需的子查询数.此外,您不能使用以下结构:

  • FROM或SELECT中的SELECT.您可以拥有子查询(在WHERE或HAVING中选择SELECT)
  • 聚合函数的组合,例如COUNT(COUNT ...)),SUM(COUNT ...))等.
  • UNION,如果你能避免它.
  • 非标准功能(如NVL)
  • 案件

sql oracle null count

16
推荐指数
3
解决办法
3万
查看次数

SQL最佳实践:count(1)或count(*)

可能重复:
计数(*)与计数(1)

我记得有传闻说:

当count(1)执行时,永远不要使用count(*)

最近我把这个建议传递给了另一位开发人员,并且被要求证明这是真的.当我得到建议时,我的论点就是我被告知的情况:数据库只返回第一列,然后计算.反驳的是,数据库不会评估括号中的任何内容.

从小桌子上的一些(不科学的)测试来看,似乎没有区别.我目前无权访问任何大型表格进行试验.

当我使用Sybase时,我得到了这个建议,表有数亿行.我现在正在使用Oracle并且数据少得多.

所以我想总结一下,我的两个问题是:

  1. 哪个更快,计数(1)还是计数(*)?
  2. 不同的数据库供应商会有所不同吗?

sql

15
推荐指数
2
解决办法
1万
查看次数

PostgreSQL中的JSON外键

是否可以将外键分配给PostgreSQL中的json属性?这是我想要实现的一个例子,但它不起作用:

CREATE TABLE Users (Id int NOT NULL PRIMARY KEY);

CREATE TABLE Data (
    Id int NOT NULL PRIMARY KEY,
    JsonData json NOT NULL, -- [{Id: 1, somedata: null},{Id: 2, somedata: null}, ...]
    CONSTRAINT FK_Users_Data FOREIGN KEY (JsonData->Id) REFERENCES Users(Id) -- this constraint will fail
);
Run Code Online (Sandbox Code Playgroud)

postgresql

15
推荐指数
3
解决办法
8343
查看次数

COUNT SQL函数的性能

使用该COUNT函数编写SQL语句时,我有两个选择.

  1. SELECT COUNT(*) FROM <table_name>
  2. SELECT COUNT(some_column_name) FROM <table_name>

在性能方面,什么是最好的SQL语句?使用选项1可以获得一些性能提升吗?

sql sql-server performance aggregate sql-server-2005

13
推荐指数
1
解决办法
1万
查看次数

"SELECT COUNT(列)"比"SELECT COUNT(*)"更快/更慢吗?

我在MSSQL2008中运行这样的查询:

select count(*)
from t1
inner join t2 on t1.id = t2.t1_id
inner join t3 on t1.id = t3.t1_id 
Run Code Online (Sandbox Code Playgroud)

假设t1.id有一个NOT NULL约束.因为它们是内连接并且t1.id永远不能为null,所以使用count(t1.id)而不是count(*)应该产生完全相同的最终结果.我的问题是:性能是否相同?

我也想知道联接是否会影响这个.我意识到添加或删除连接会影响性能和结果集的长度.假设在不更改连接模式的情况下,您设置count为仅定位一个表.会有什么不同吗?换句话说,这两个查询之间是否存在差异:

select count(*)    from t1 inner join t2 on t1.id = t2.t1_id 
select count(t1.*) from t1 inner join t2 on t1.id = t2.t1_id 
Run Code Online (Sandbox Code Playgroud)

MySQL中的COUNT(id)与COUNT(*)为MySQL回答了这个问题,但是我找不到具体的MS-SQL答案,而且我找不到任何考虑join因素的东西.

注意:我试图在Google和SO上找到这些信息,但很难弄清楚如何说出我的搜索.

performance join count sql-server-2008

13
推荐指数
2
解决办法
2万
查看次数

计算查询行的最有效方法

我正在使用Hibernate来检索特定查询的行数.假设我有一个名为'Person'的表,其中包含各种列.其中一列是'name'.

如果我想获得名为"安德鲁"的人数,哪种方式最有效?假设它们中的一些/全部存在性能差异.有没有更好的方法来使用Hibernate/SQL?

(1)选择所有列

Query query = session.createQuery("from Person where name= :name");
query.setParameter("name", name);
List result = query.list();
int count = result.size();
Run Code Online (Sandbox Code Playgroud)

(2)只选择名称列

Query query = session.createQuery("select name from Person where name= :name");
query.setParameter("name", name);
List result = query.list();
int count = result.size();
Run Code Online (Sandbox Code Playgroud)

(3)在查询中使用Count

Query query = session.createQuery("select count(*) from Person where name= :name");
query.setParameter("name", name);
long count = (Long) query.uniqueResult();
Run Code Online (Sandbox Code Playgroud)

(4)在查询中使用Count和name列

Query query = session.createQuery("select count(name) from Person where name= :name");
query.setParameter("name", name);
long count = (Long) query.uniqueResult();
Run Code Online (Sandbox Code Playgroud)

编辑:对不起,我的列表中有两个3号

java sql hibernate

8
推荐指数
1
解决办法
1万
查看次数

如果DATETIME或DATETIME2因为它们包含时间部分,为什么索引可能不会做太多?

评论"如何减少简单选择查询的响应时间?" 告诉:

  • "LaunchDate上的数据类型是什么?如果DATETIME或DATETIME2是DATETIME或DATETIME2,则索引不太可能做多,因为它们包含时间部分 - OMG Ponies"

  • "@OMG - 为什么DateTime列上的Clustered Index不能提高性能?查询是一个范围扫描,它允许快速索引查找,因为所有数据都在顺序块中?半相关... msdn. microsoft.com/en-us/library/ms177416.aspx - 卡尔加里编码器"

  • "Calgary Coder:DATETIME/2包括时间 - 一个索引,无论是聚簇的还是非聚集的,对于重复次数而不是范围的日期都是有用的. - OMG Ponies"

我在DATETIME类型列上创建了一个带有聚簇索引的测试表,LaunchDate并观察索引查找类似于上述问题中引用的查询:

SELECT COUNT(primaryKeyColumn) 
FROM   MarketPlan 
WHERE  LaunchDate > @date
Run Code Online (Sandbox Code Playgroud)

而不是表或索引扫描.

为什么DateTime列上的聚簇索引不会提高性能?
为什么索引不是可能做得太多,如果它DATETIMEDATETIME2因为它们包括时间部分?

我很欣赏一个脚本,说明DATETIME列的索引不会提高性能.

更新:另外,OMG没有暗示对指数DATE型列将是有益的,但不DATETIMEDATETIME2

sql-server indexing performance database-design clustered-index

8
推荐指数
1
解决办法
8411
查看次数

SQL性能低下

我的查询如下;

 SELECT COUNT(Id) FROM Table
Run Code Online (Sandbox Code Playgroud)

该表包含3300万条记录 - 它包含Id上的主键,没有其他索引.

查询需要30秒.

实际执行计划显示它使用聚簇索引扫描.

我们已经分析了该表,发现它没有使用此链接中显示的第一个查询进行分段:http://sqlserverpedia.com/wiki/Index_Maintenance.

关于为什么这个查询如此缓慢以及如何解决它的任何想法.

表定义:

 CREATE TABLE [dbo].[DbConversation](
[ConversationID] [int] IDENTITY(1,1) NOT NULL,
[ConversationGroupID] [int] NOT NULL,
[InsideIP] [uniqueidentifier] NOT NULL,
[OutsideIP] [uniqueidentifier] NOT NULL,
[ServerPort] [int] NOT NULL,
[BytesOutbound] [bigint] NOT NULL,
[BytesInbound] [bigint] NOT NULL,
[ServerOutside] [bit] NOT NULL,
[LastFlowTime] [datetime] NOT NULL,
[LastClientPort] [int] NOT NULL,
[Protocol] [tinyint] NOT NULL,
[TypeOfService] [tinyint] NOT NULL,
  CONSTRAINT [PK_Conversation_1] PRIMARY KEY CLUSTERED 
 (
[ConversationID] ASC
 )WITH (PAD_INDEX  = …
Run Code Online (Sandbox Code Playgroud)

sql sql-server-2005

7
推荐指数
1
解决办法
1016
查看次数

将列更新为另一列中特定值的COUNT行.SQL Server

我的表是:

|ID |data | cr |
| 1 | AAA |    |
| 2 | AAA |    |
| 3 | AAA |    |
| 4 | BBB |    |
| 5 | CCC |    |
| 6 | BBB |    |
Run Code Online (Sandbox Code Playgroud)

我需要结果:

|ID |data | cr |
| 1 | AAA | 3  |
| 2 | AAA | 3  |
| 3 | AAA | 3  |
| 4 | BBB | 2  |
| 5 | CCC …
Run Code Online (Sandbox Code Playgroud)

sql-server

6
推荐指数
1
解决办法
3232
查看次数