在 SQL 服务器效率方面哪个更好;使用子查询或连接?
我知道不相关比相关子查询更好。但是连接呢?
使用联接使 SQL 变得更具可读性和可理解性
OUTER JOIN and check for NULLS
Run Code Online (Sandbox Code Playgroud)
但是对于数据库的性能来说是更糟还是更好?
我想在将数据库更改推出到 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 选择以使用数据透视而不是所有 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 服务器中有一个生产数据库,并希望在功能完成后进行最后的润色。在发货之前,我想确保我在 SQL Server 数据库中进行了一些清理并截断和缩小日志文件?
我可以运行夜间作业来截断日志和缩小文件吗?
这就是我到目前为止所拥有的: 我的恢复模型很简单
ALTER proc [dbo].[UTIL_ShrinkDB_TruncateLog] as
-- exec sp_helpfile BACKUP LOG PMIS WITH TRUNCATE_ONLY
DBCC 收缩文件 (PMIS, 1)
DBCC 收缩文件 (PMIS, 1)
应该索引多对多表吗?什么样的索引最好?
这是一个示例表:
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) 我正在尝试报告电子邮件消息系统中的数据,并希望通过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
.
我有两个表:Message
和Attachments
(代表具有一对多关系的实体类型)如下:
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)
但这不起作用 - 有什么方法可以做我正在寻找的东西?
我有一个执行简单更新的存储过程(见下文)。
我只想更新传递的字段,而不是那些为空的字段。也就是说,如果我没有得到某个参数的参数值,我不想将表数据更新为 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 脚本是:
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)
(恢复方式很简单)
我有下面的 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) 我有一个名为 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 的种子?
编辑:添加了数据库图