小编kac*_*apy的帖子

子查询或连接?

在 SQL 服务器效率方面哪个更好;使用子查询或连接?

我知道不相关比相关子查询更好。但是连接呢?

使用联接使 SQL 变得更具可读性和可理解性

OUTER JOIN and check for NULLS
Run Code Online (Sandbox Code Playgroud)

但是对于数据库的性能来说是更糟还是更好?

sql-server-2005 sql-server

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

如何编写数据库验证脚本?

我想在将数据库更改推出到 QA、UAT 和生产环境时创建一种智能方式来执行 SQL 脚本,以便在维护完成后冒烟测试数据库更改是否正确。

做到这一点的最佳方法是什么?

现在我正在运行多个这样的 SQL 选择来对现有的 DB 值与预期值进行可视化比较。这是我的代码:

select value as DBvalue, 'text' as PRODvalue -- could be 'text' or 'html'
from ConfigParams
where paramname = 'EmailBodyType'
and environment = 'prod'
Run Code Online (Sandbox Code Playgroud)

然后结果将是一个包含两个字段的结果集,在预期值旁边显示 DB 值。

我有 10 个左右的 SQL 选择列表来验证参数值在数据库工作完成后是否更新和正确。有没有更好的办法?

sql-server

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

SQL Server 2005:如何使用数据透视代替一堆 case 语句?

请告诉我如何修改此 SQL 选择以使用数据透视而不是所有 case 语句。

SELECT t.ProjectId,    
   COALESCE(MAX(ExecutiveChampion), 'n/a'),    
   COALESCE(MAX(BusinessOwner), 'n/a'),    
   COALESCE(MAX(BusinessAnalyst), 'n/a'),    
   COALESCE(MAX(GeneralContractor), 'n/a'),    
   COALESCE(MAX(PrimaryPM),  'n/a'),    
   COALESCE(MAX(DevelopmentManager), 'n/a'),    
   COALESCE(MAX(DevelopmentLead), 'n/a'),    
   COALESCE(MAX(TDM), 'n/a'),    
   COALESCE(MAX(PTM), 'n/a')    
FROM (    
    SELECT pl.ProjectId,     
           CASE WHEN StakeholderCID = 95  THEN FullName ELSE NULL END as 'ExecutiveChampion',    
           CASE WHEN StakeholderCID = 96  THEN FullName ELSE NULL END as 'BusinessOwner',    
           CASE WHEN StakeholderCID = 97  THEN FullName ELSE NULL END as 'BusinessAnalyst',    
           CASE WHEN StakeholderCID = 100 THEN FullName ELSE NULL END as 'GeneralContractor',    
           CASE WHEN StakeholderCID …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 syntax pivot

5
推荐指数
2
解决办法
1630
查看次数

SQL Server 中日志截断的最佳实践是什么?

我在 SQL 服务器中有一个生产数据库,并希望在功能完成后进行最后的润色。在发货之前,我想确保我在 SQL Server 数据库中进行了一些清理并截断和缩小日志文件?

我可以运行夜间作业来截断日志和缩小文件吗?

这就是我到目前为止所拥有的: 我的恢复模型很简单

ALTER proc [dbo].[UTIL_ShrinkDB_TruncateLog] as

-- exec sp_helpfile BACKUP LOG PMIS WITH TRUNCATE_ONLY

DBCC 收缩文件 (PMIS, 1)

DBCC 收缩文件 (PMIS, 1)

sql-server-2005 logs

5
推荐指数
1
解决办法
858
查看次数

如何最有效地索引多对多表

应该索引多对多表吗?什么样的索引最好?

这是一个示例表:

CREATE TABLE user_role (
  userId INT,
  roleId INT
)

--edit: drachenstern - I added the table def based on the original comments, and assumed ints.
Run Code Online (Sandbox Code Playgroud)

sql-server-2005

5
推荐指数
1
解决办法
1611
查看次数

获取按月和年分组的计数

我正在尝试报告电子邮件消息系统中的数据,并希望通过month/year.

SELECT YEAR(crdate) AS y,
       MONTH(crdate) AS m,
       COUNT(*) AS tally
FROM   MESSAGE
WHERE  YEAR(crdate) = 2012
       AND SUBJECT <> 'Welcome' --exclude default messages
GROUP BY
       YEAR(crdate),
       MONTH(crdate)
Run Code Online (Sandbox Code Playgroud)

这就是我所拥有的,但它的限制在于我需要手动更改年份。这可以升级为以这种month/year格式输出表格中的所有日期吗?

删除年份会将可能数年的所有月份聚集在一起并扭曲数据。我希望从那个特定的month/year.

sql-server-2008 sql-server

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

如何根据另一个表将布尔值放入 SELECT 操作中?

我有两个表:MessageAttachments(代表具有一对多关系的实体类型)如下:

CREATE TABLE message (
    messageId ..., 
    [from]..., 
    [to]..., 
    subject..., 
    body...
);

CREATE TABLE attachments (
    messageId..., 
    filename...
);
Run Code Online (Sandbox Code Playgroud)

我想选择基本消息数据并包含一个位列来表示消息是否有附件。我正在尝试在如下所示的操作中使用 EXISTS:

SELECT  
M.*,
hasAttachments = EXISTS(SELECT AttachmentId 
                          FROM Attachment 
                         WHERE messageId = M.messageId),
FROM Message M
Run Code Online (Sandbox Code Playgroud)

但这不起作用 - 有什么方法可以做我正在寻找的东西?

sql-server-2005 sql-server

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

更新存储的 proc 传递给 proc 的任何字段,而让其他人独自一人

我有一个执行简单更新的存储过程(见下文)。

我只想更新传递的字段,而不是那些为空的字段。也就是说,如果我没有得到某个参数的参数值,我不想将表数据更新为 null,而是保留当前值。

这可以在这样的 sql 更新语句中完成吗?

ALTER PROCEDURE [dbo].[upd_MessageDetail]  
    @MessageId INT,  
    @IsDraft INT,  
    @IsPreviewed INT,  
    @IsRead INT,  
    @IsFlagged INT,  
    @IsDeleted INT,  
    @IsArchived INT    
AS  
BEGIN  


        UPDATE MessageDetail   
        SET 
            IsDraft = @IsDraft,  
            IsPreviewed = @IsPreviewed,  
            IsRead = @IsRead,  
            IsFlagged = @IsFlagged,  
            IsDeleted = @IsDeleted,  
            IsArchived = @IsArchived   
        WHERE MessageId = @MessageId
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 stored-procedures

4
推荐指数
1
解决办法
2320
查看次数

有一个 92MB 的 MDF 和一个 58MB 的 LDF cobo 好吗?如何管理日志以保持运行良好?

我有工作来修剪用于历史记录和日志记录的表格,以便保持它们的整齐。我想确保我不会忽略日志文件。

我可以或应该怎么做以及如何检查日志文件?

我每晚运行的 sql 脚本是:

declare @DBname varchar(500)
set @DBname = 'E:\Database\backup\PMIS_backup_'+ convert(varchar(MAX), getdate(), 23 ) +'.bak'

BACKUP DATABASE [PMIS] TO  DISK = @DBname
WITH NOFORMAT, NOINIT,  NAME = @DBname
, SKIP, REWIND, NOUNLOAD,  STATS = 10
Run Code Online (Sandbox Code Playgroud)

(恢复方式很简单)

sql-server-2005 logs

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

能否将这个 SQL 提高效率并组合成一个选择?

我有下面的 4 个 SQL 查询,最后我将它们组合成一个结果集。

我猜是因为我在每个 SQL 部分都对相同的表进行操作,所以有一种很酷的方法可以从一个统一的 SQL 查询中获取我的结果。

目前我是这样做的:

select 
[date] = CONVERT(DATE, M.crdate), 
[tally sent to smc w/ attachment] = count(*) ,
[total MB size] =  sum(cast(AD.Size as decimal (10,2)) )/1024/1024 
into #tmp_Attachments_Sent_To_smc
from AttachmentDetail AD
inner join MessageAttachment MA on AD.AttachmentId = MA.AttachmentId
inner join MessageRecipient MR on MA.MessageId = MR.MessageId 
inner join Message M on MR.MessageId = M.id
where AD.isinline <>1 and MR.RecipientTypeId =2 and left(mr.EmailAddress,4)='smc+' 
GROUP BY  CONVERT(DATE, M.crdate)
ORDER BY [date] DESC;
--select …
Run Code Online (Sandbox Code Playgroud)

sql-server

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

不能截断具有 pk/fk 关系的表?

我有一个名为 Folder 的表,其中包含 3 个字段:Id (PK)、Name、UserId (FK)

另一个名为 User 的表有两个字段:Id (PK), UserName

我正在尝试运行此 sql:

truncate table Folder
truncate table User
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

Cannot truncate table 'Folder' because it is being referenced by a FOREIGN KEY constraint.
Cannot truncate table 'user'   because it is being referenced by a FOREIGN KEY constraint.
Run Code Online (Sandbox Code Playgroud)

...即使在删除两个表中的所有记录后,我也得到了这个。为什么我不允许截断我的表格?

如果现在有办法在 pk/fk 关系表上运行截断,我如何在不使用截断的情况下轻松重置 PK 的种子?

编辑:添加了数据库图 在此处输入图片说明

sql-server-2005

0
推荐指数
1
解决办法
1795
查看次数