哪个查询更快?
不存在:
SELECT ProductID, ProductName
FROM Northwind..Products p
WHERE NOT EXISTS (
SELECT 1
FROM Northwind..[Order Details] od
WHERE p.ProductId = od.ProductId)
Run Code Online (Sandbox Code Playgroud)
或者不是:
SELECT ProductID, ProductName
FROM Northwind..Products p
WHERE p.ProductID NOT IN (
SELECT ProductID
FROM Northwind..[Order Details])
Run Code Online (Sandbox Code Playgroud)
查询执行计划表明他们都做同样的事情.如果是这种情况,这是推荐的形式?
这基于NorthWind数据库.
[编辑]
刚刚找到这篇有用的文章:http: //weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx
我想我会坚持使用NOT EXISTS.
我正在尝试创建一个基本数据库触发器,当删除database2.table2中的一行时,该触发器有条件地从database1.table1中删除行.我是触发器的新手,并希望学习实现这一目标的最佳方法.这就是我到目前为止所拥有的.建议?
CREATE TRIGGER sampleTrigger
ON database1.dbo.table1
FOR DELETE
AS
IF EXISTS (SELECT foo
FROM database2.dbo.table2
WHERE id = deleted.id
AND bar = 4)
-- If there is a row that exists in database2.dbo.table2
-- matching the id of the deleted row and bar=4, delete
-- it as well.
-- DELETE STATEMENT?
GO
Run Code Online (Sandbox Code Playgroud) 有两个表由id链接:
item_tbl (id)
link_tbl (item_id)
Run Code Online (Sandbox Code Playgroud)
有些记录中item_tbl没有匹配的行link_tbl.一个可以计算其金额的选择将是:
SELECT COUNT(*)
FROM link_tbl lnk LEFT JOIN item_tbl itm ON lnk.item_id=itm.id
WHERE itm.id IS NULL
Run Code Online (Sandbox Code Playgroud)
我想删除那些孤儿记录(那些在其他表中没有匹配的记录),link_tbl但我能想到的唯一方法是:
DELETE FROM link_tbl lnk
WHERE lnk.item_id NOT IN (SELECT itm.id FROM item_tbl itm)
Run Code Online (Sandbox Code Playgroud)
在2003年的16,844,347个孤儿记录中有
3,033,811个记录的link_tbl
262,086,253条记录.
服务器有4GB RAM和8核CPU.item_tbl
link_tbl
EXPLAIN DELETE FROM link_tbl lnk
WHERE lnk.item_id NOT IN (SELECT itm.id FROM item_tbl itm)
Run Code Online (Sandbox Code Playgroud)
返回:
Delete on link lnk (cost=0.00..11395249378057.98 rows=131045918 width=6)
-> Seq Scan …Run Code Online (Sandbox Code Playgroud) 我有以下数据:
Number c1 c2 c3
325 A K NFW
325 U G GFD
32713 A K fgh
3271 U G ghad
327 A G yrg
3277 A K bfb
Run Code Online (Sandbox Code Playgroud)
我不想选择那些不唯一的行.即我只想要那些具有不同"数字"列的行.我的结果应该看起来像:
Number c1 c2 c3
32713 A K fgh
3271 U G ghad
327 A G yrg
3277 A K bfb
Run Code Online (Sandbox Code Playgroud)
我编写了以下代码,但它并没有完全正常工作:
SELECT * from [table] GROUP BY [all columns ] HAVING Count(*) = 1
Run Code Online (Sandbox Code Playgroud)
任何建议,以获得他所需的结果将不胜感激.
我有一个where子句
... Where TruckID IN (select VanID from Vantbl)
Run Code Online (Sandbox Code Playgroud)
我喜欢使用一个案例,因此它足够聪明
我有完整的后续行动
... Where TruckID IN
CASE WHEN @VehicleType = 'VAN'
THEN (select VanID from Vantbl)
CASE WHEN @VehicleType = 'SUV'
THEN (select SUVID from SUVtbl)
END
Run Code Online (Sandbox Code Playgroud)
但似乎没有工作.我可以用任何方式让它像这样工作.
我正在尝试加快我的存储过程,所以我使用下面的统计信息以两种格式测试我的存储过程
方法1:使用join
set statistics io on
select top 2000
p.Vehicleno,
dbo.GetVehicleStatusIcon1(p.Direction, StatusCode, 0) as 'Status',
location,
Convert(varchar(13), p.TrackTime, 102) + ' ' + Convert(varchar(13), p.TrackTime, 108) AS 'TrackTime',
p.Speed, p.Ignition
from
pollingdata p
inner join
assignvehicletouser asn on asn.vehicleno = p.vehicleno
where
asn.empid = 1
Run Code Online (Sandbox Code Playgroud)
我得到统计结果为
Table 'Worktable'. Scan count 943, logical reads 7671, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'AssignVehicleToUser'. Scan count 1, logical reads 41, …Run Code Online (Sandbox Code Playgroud) sql-server join where-clause logical-reads sql-execution-plan
sql ×4
sql-server ×4
bigdata ×1
exists ×1
join ×1
notin ×1
postgresql ×1
sql-delete ×1
t-sql ×1
triggers ×1
where-clause ×1