Sql server 在下面的示例中,这在MS SQL中是如何工作的
我对MS SQL非常陌生,但现在我不得不越来越多地使用它。我遇到了一些东西,以前有人写过,但没有写任何文档。。我真幸运。。。我似乎无法对这句话保持清醒:Sql server 在下面的示例中,这在MS SQL中是如何工作的,sql-server,Sql Server,我对MS SQL非常陌生,但现在我不得不越来越多地使用它。我遇到了一些东西,以前有人写过,但没有写任何文档。。我真幸运。。。我似乎无法对这句话保持清醒: BEGIN TRANSACTION loadMissingAllocations INSERT INTO @missingAllocs SELECT * FROM @absAllocs EXCEPT SELECT * FROM @ttaAllocs SET @rowCount = @@ROWCOUNT S
BEGIN TRANSACTION loadMissingAllocations
INSERT INTO @missingAllocs
SELECT * FROM @absAllocs
EXCEPT
SELECT * FROM @ttaAllocs
SET @rowCount = @@ROWCOUNT
SET @eventDetails = 'End loadMissingAllocations: ' + CAST(@rowCount as VARCHAR(10)) + ' rows affected';
COMMIT TRANSACTION loadMissingAllocations
所以,看起来我们正在从absALLOCS中选择所有内容,并将其插入missingALLOCS中,但对我来说,除了似乎完全不合适。。。我理解的是:
从x中选择除y之外的所有内容,并将其放入z中
这不可能,对吧
感谢您的指导!: 链接中EXCEPT子句的良好视觉表示
EXCEPT基本上从两个表中删除公共元素,而不从第二个表中获取任何元素 你的直觉是对的 从x中选择除y之外的所有内容,并将其放入z中 将其转化为表格意味着:
SELECT EVERYTHING FROM @absAllocs
EXCEPT
WHAT ALREADY EXISTS IN @ttaAllocs
AND
STORE THAT RESULT IN @missingAllocs
或
@absAllocs中存在但@ttaAllocs中不存在的所有内容都保存到@missingAllocs中。除了关系减法。第二组的结果将从第一组的结果中删除。其余部分插入@missingAllocs.SELECT。。除了选择。。。本身是有效的声明;然后将其结果用作插入的源。手册您也可以替换,除非通常使用“选择不同…”。。。哪里没有选择。。或者从表1中选择DISTINCT table1.*。左连接table2,其中table2.colum为NULL,并且…@RaymondNijland:只有当存在可用于连接的键列时,才是如此。EXCEPT将以正确的方式处理NULL值,即,它将NULL与NULL相匹配,以确定行是否相同,因此无论是否存在联接表的自然方式,都可以使用它,实际上@jeroenmoster使用LEFT JOIN来替换有点棘手,因为EXPECT句柄NULL不同,我忘记了这一点。好吧,我的想法其实没什么不同,是吗?