比较两个大型结果/行集的最有效方法的当前建议似乎是使用EXCEPT运算符。随着行大小的增加(更改@last 值),下面这个自包含的 SQL 脚本变得非常低效。我试图在组合表中找到唯一的条目,但没有任何改进。
DECLARE @first AS INT, @step AS INT, @last AS INT;
-- This script is comparing two record sets using EXCEPT
-- I want to find additions from OLD to NEW
-- As number of rows increase performance gets terrible
-- I don't have to use two tables. I could use one combined table but I want the same result as quickly as possible
-- Compare 100 to 110 rows - 0 seconds
-- Compare …Run Code Online (Sandbox Code Playgroud) 通常,当我看到使用以下内容的 SQL 时:
select * from employees where epmloyeeTypeId in (select id from type where name = 'emp')
Run Code Online (Sandbox Code Playgroud)
我where用这个替换:
select e.* from employees e
inner join type t on t.id=e.epmloyeeTypeId and t.name = 'emp'
Run Code Online (Sandbox Code Playgroud)
如果它是一个not in(如下所示)而不是一个in子句,是否可以对逆做同样的事情?
INSERT into Subscriptions(ProjectId, RecordTypeCID, NTID, Active, Added, LastUpdate, UpdateBy)
SELECT @ProjectId, RecordTypeCID, @NTID, 1, GETDATE(), GETDATE(), @NTID
FROM @Check CHK
WHERE CHK.ActiveStatus=1
And Not Exists (SELECT SubscriptionId FROM Subscriptions
WHERE ProjectId=@ProjectId
and NTID=@NTID
and RecordTypeCID = CHK.RecordTypeCID
) …Run Code Online (Sandbox Code Playgroud) 我们的工作场所已开始扫描所有文件,而不是手动将它们保存在档案等中。
平均而言,我们每次扫描 1,000 个文档(每天大约发生 30 次)。
每次我们扫描 1,000 个文档时,我们都会收到少量的 OCR 错误/警告。
是否可以将最低和最高顺序号提供给变量并让 SQL Server 输出不在最低和最高顺序号之间的表中的所有缺失顺序号的列表?
例如
OCROrderNo
---------------
9001
9002
9006
9007
9008
9009
Run Code Online (Sandbox Code Playgroud)
最低编号 9001,最高编号 9009
MissingOrderNos
--------------------
9003
9094
9005
Run Code Online (Sandbox Code Playgroud)
根据答案,这就是我正在尝试的:
DECLARE @Start INT = 1497389
, @End INT = 1498264
SELECT @Start + N - 1
FROM dbo.Numbers
WHERE N <= ( 1 + @End - @Start )
EXCEPT
SELECT [ORDERNUMBER]
FROM [dwdata].[dbo].[ORDERS]
ORDER BY [ORDERNUMBER] DESC
Run Code Online (Sandbox Code Playgroud)
导致:
消息 207,级别 16,状态 1,第 10 行
无效的列名“ORDERNUMBER”。
如果语句包含 …
将数据库更改为部分包含时,出现以下错误:
无法解决 EXCEPT 操作中“Latin1_General_CI_AS”和“Latin1_General_100_CI_AS_KS_WS_SC”之间的排序规则冲突。
在编译 > 对象期间,过程“RSExecRole.DeleteExtensionModuleDDL”中遇到错误。数据库“VeeamOne”的包含选项已更改,或者该对象存在于模型 db 中并且用户尝试创建新的包含数据库。ALTER DATABASE 语句失败。无法更改数据库“VeeamOne”的包含选项,因为在验证 SQL 模块期间遇到编译错误。请参阅以前的错误。ALTER DATABASE 语句失败。(.Net SqlClient 数据提供程序)
我认为这是报告的对象来自 SSRS。但是,我正在更改排序规则的 DB 是一个完全独立的应用程序。
有没有人对如何解决这个问题有任何建议?
================================================== ====================== 好的,这是 proc 的代码,但不确定它是什么导致它无法被包含
USE [VeeamOne]
GO
/****** Object: StoredProcedure [reporter].[DeleteExtensionModuleDDL] Script Date: 02/12/2015 12:06:19 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [reporter].[DeleteExtensionModuleDDL]
@EMID int
AS
BEGIN
SET NOCOUNT ON;
declare @Debug bit;
set @Debug = 0;
declare @Emulate bit;
set @Emulate = 0;
declare @reportPackDestructorFunctionName nvarchar(max)
exec @reportPackDestructorFunctionName = [reporter].GenerateExtensionModuleDestructorName @EMID
if …Run Code Online (Sandbox Code Playgroud) sql-server collation sql-server-2012 contained-database except
这些是我创建并在其中插入值的表:
CREATE TABLE Customer
(Customer_No INTEGER IDENTITY (1,1) PRIMARY KEY,
Customer_Name VARCHAR(30) NOT NULL
)
CREATE TABLE DVD
(DVD_No INTEGER IDENTITY (1,1) PRIMARY KEY,
DVD_Name VARCHAR(30)
)
CREATE TABLE DVD_Purchase
(DVD_Purchase_No INTEGER IDENTITY (1,1) PRIMARY KEY,
DVD_No INTEGER NOT NULL,
Customer_No INTEGER NOT NULL
)
INSERT INTO Customer (Customer_Name)
VALUES('Daman')
INSERT INTO Customer (Customer_Name)
VALUES('Saif')
INSERT INTO Customer (Customer_Name)
VALUES('Gurung')
INSERT INTO Customer (Customer_Name)
VALUES('Upendra')
INSERT INTO Customer (Customer_Name)
VALUES('Ornob')
INSERT INTO DVD (DVD_Name)
VALUES('Bleach')
INSERT INTO DVD (DVD_Name)
VALUES('Gintama') …Run Code Online (Sandbox Code Playgroud) 我们有一些顾问致力于扩展内部数据仓库。我正在做代码审查并在所有加载过程中遇到这种模式:
MERGE [EDHub].[Customer].[Class] AS TARGET
USING (
SELECT <columns>
FROM [dbo].[vw_CustomerClass]
WHERE JHAPostingDate = @PostingDate
) AS SOURCE
ON TARGET.BankId = SOURCE.BankId -- This join is on the business keys
AND TARGET.Code = SOURCE.Code
WHEN NOT MATCHED BY TARGET
THEN
<INSERT Statement>
WHEN MATCHED
AND TARGET.IsLatest = 1
AND EXISTS (
SELECT SOURCE.[HASH]
EXCEPT
SELECT TARGET.[Hash]
)
THEN
<UPDATE Statement>
Run Code Online (Sandbox Code Playgroud)
要点是,如果我们有一个新的业务键,则插入,但如果业务键存在并且属性的散列与我们的当前行不匹配,则更新旧行并插入一个新行(稍后在代码中)。一切正常,但是当我看到这段代码时我暂停了
AND EXISTS (
SELECT SOURCE.[HASH]
EXCEPT
SELECT TARGET.[Hash]
)
Run Code Online (Sandbox Code Playgroud)
与 SOURCE.[HASH] <> TARGET.[Hash] 相比,它似乎过于复杂。EXCEPT 将进行准确的 NULL 比较,但在我们的情况下,哈希值永远不会为 NULL(或者我们有更大的问题)。我希望我们的代码易于阅读,这样当有人必须维护它时,它不会混淆。我向我们的顾问询问了它,他们推测它可能会因为集合操作而更快,但我决定编写一个简单的测试(下面的测试代码)。
我注意到的第一件事是 …
performance sql-server sql-server-2016 except query-performance
DROP TABLE IF EXISTS history;
CREATE TABLE history (
id integer NOT NULL,
ticket_id integer NOT NULL);
ALTER TABLE ONLY history ADD CONSTRAINT history_pkey PRIMARY KEY (id);
CREATE INDEX history_ticket_id ON history USING btree (ticket_id);
DROP TABLE IF EXISTS ticket;
CREATE TABLE ticket (
id integer NOT NULL
);
ALTER TABLE ONLY ticket ADD CONSTRAINT ticket_pkey PRIMARY KEY (id);
Run Code Online (Sandbox Code Playgroud)
INSERT INTO history values (generate_series(1, 30000), generate_series(1, 30000));
ANALYZE history;
INSERT INTO ticket values (generate_series(1, 40000));
ANALYZE ticket;
Run Code Online (Sandbox Code Playgroud)
performance subquery postgresql-9.3 except postgresql-performance
我们有一张用于存储客户和物品的表。我们需要能够找到购买了一件商品而没有购买另一件商品的客户:
customer item
Sally 1
Sally 2
Sally 3
John 1
John 2
Paul 2
Paul 3
Run Code Online (Sandbox Code Playgroud)
我们想找到购买“1”而不是“3”的用户。在这种情况下,我们只想要“约翰”。
我有一张这样的表:
Id Status
-- -----------
1 Closed
1 In progress
2 Rejected
3 Cancelled
4 Rejected
4 Closed
5 In progress
Run Code Online (Sandbox Code Playgroud)
我想说明,有行Status的封闭,拒绝或取消。但是,我想排除具有不同状态值的 ID,即使它们也具有这三个中的任何一个。
所以,对于我的例子,我希望输出是这样的:
Id Status
-- ---------
2 Rejected
3 Cancelled
4 Rejected
4 Closed
Run Code Online (Sandbox Code Playgroud)
我的查询应该是什么样的?
我有一张保存付款数据的表。我想将以拒绝状态结束的订单插入#tmp_Declined。然后,我想将最初被拒绝但在使用替代付款方式时获得授权的付款插入 #tmp_Authorized。
我可以使用 2 个 select into 语句来做到这一点,其中 where 子句略有不同,但使用相同的基表。
我考虑了一个类似下面的例子:
select *
into #tmp_Declined
from Payments
except
select *
from Payments
where WasOrginallyDeclined = 1
and MostRecentPaymentAccepted = 1
Run Code Online (Sandbox Code Playgroud)
这种方法虽然仍然会在某个时间填充一个临时表。是否有保留字或查询“技巧”将插入#tmpA 中满足条件,然后插入#tmpB 中未插入#tmpA 中的任何内容?
我希望能够通过一个事务写入 2 个表。
except ×10
sql-server ×7
performance ×2
collation ×1
join ×1
order-by ×1
query ×1
subquery ×1
t-sql ×1