在我看来,你可以使用NOT EXISTS,NOT IN或LEFT JOIN WHERE为NULL在SQL查询中做同样的事情.例如:
SELECT a FROM table1 WHERE a NOT IN (SELECT a FROM table2)
SELECT a FROM table1 WHERE NOT EXISTS (SELECT * FROM table2 WHERE table1.a = table2.a)
SELECT a FROM table1 LEFT JOIN table2 ON table1.a = table2.a WHERE table1.a IS NULL
Run Code Online (Sandbox Code Playgroud)
我不确定我的语法是否正确,但这些是我见过的一般技术.为什么我会选择使用一个而不是另一个?性能有所不同......?哪一个是最快/最有效的?(如果它取决于实施,我何时会使用每一个?)
我很好奇以下哪一项会更有效率?
我一直对使用有点谨慎,IN因为我相信SQL Server会将结果集转化为一个大的IF声明.对于大的结果集,这可能导致性能不佳.对于小结果集,我不确定是否更可取.对于大型结果集,EXISTS效率会不会更高?
WHERE EXISTS (SELECT * FROM Base WHERE bx.BoxID = Base.BoxID AND [Rank] = 2)
Run Code Online (Sandbox Code Playgroud)
与
WHERE bx.BoxID IN (SELECT BoxID FROM Base WHERE [Rank = 2])
Run Code Online (Sandbox Code Playgroud) 我以前写这样的EXISTS检查:
IF EXISTS (SELECT * FROM TABLE WHERE Columns=@Filters)
BEGIN
UPDATE TABLE SET ColumnsX=ValuesX WHERE Where Columns=@Filters
END
Run Code Online (Sandbox Code Playgroud)
前一个DBA中的一个告诉我,当我做一个EXISTS条款时,请使用SELECT 1而不是SELECT *
IF EXISTS (SELECT 1 FROM TABLE WHERE Columns=@Filters)
BEGIN
UPDATE TABLE SET ColumnsX=ValuesX WHERE Columns=@Filters
END
Run Code Online (Sandbox Code Playgroud)
这真的有所作为吗?
我有两个数据库,一个保存库存,另一个包含主数据库记录的子集.
以下SQL语句不起作用:
SELECT stock.IdStock
,stock.Descr
FROM [Inventory].[dbo].[Stock] stock
WHERE stock.IdStock NOT IN
(SELECT foreignStockId FROM
[Subset].[dbo].[Products])
Run Code Online (Sandbox Code Playgroud)
不是不起作用.删除NOT会得到正确的结果,即两个数据库中的产品.但是,使用NOT IN并不会返回任何结果.
我做错了什么,有什么想法吗?
我在理解sql中的连接时遇到了麻烦,并且遇到了这个我认为可能对我有用的图像.问题是我不完全理解它.例如,图像右上角的连接,它将整个B圆圈的颜色设置为红色,但只有A的重叠.图像使得它看起来像圆圈B是sql语句的主要焦点,但是sql语句本身,从A开始(从A中选择,加入B),向我传达了相反的印象,即A将成为sql语句的焦点.
同样,下面的图像只包含来自B圈的数据,那么为什么在连接语句中包含A呢?
问题:从右上角顺时针工作并在中心完成,有人可以提供有关每个sql图像表示的更多信息,解释
a)为什么在每种情况下都需要连接(例如,特别是在没有数据来自A或B的情况下,即只有A或B而不是两者都被着色的情况)
b)以及任何其他细节可以澄清为什么图像是sql的良好表示

我前几天调试了一个存储过程,发现了一些像这样的逻辑:
SELECT something
FROM someTable
WHERE idcode <> (SELECT ids FROM tmpIdTable)
Run Code Online (Sandbox Code Playgroud)
这没有任何回报.我认为"<>"看起来有点奇怪,所以我将其改为"NOT IN"然后一切正常.我想知道为什么会这样?这是一个非常古老的过程,我不确定该问题存在多久,但我们最近从SQL Server 2005切换到SQL Server 2008时发现了这个问题."<>"和"NOT IN"之间的真正区别是什么,并且Server2005和2008之间的行为有所改变?
Oracle查询之间not in和之间的区别是什么not exists?
我not in什么时候使用?而且not exist?
所以我有一个帖子和一个用户.
发布has_many用户,用户发布帖子.
我需要一个查找,找到所有没有任何用户的帖子,如下所示:
Post.first.users
=> []
Run Code Online (Sandbox Code Playgroud) 我有一个insert-select语句,只需插入其中两个表中不存在该行的特定标识符的行.以下哪项会更快?
INSERT INTO Table1 (...)
SELECT (...) FROM Table2 t2
WHERE ...
AND NOT EXISTS (SELECT 'Y' from Table3 t3 where t2.SomeFK = t3.RefToSameFK)
AND NOT EXISTS (SELECT 'Y' from Table4 t4 where t2.SomeFK = t4.RefToSameFK AND ...)
Run Code Online (Sandbox Code Playgroud)
... 要么...
INSERT INTO Table1 (...)
SELECT (...) FROM Table2 t2
WHERE ...
AND t2.SomeFK NOT IN (SELECT RefToSameFK from Table3)
AND t2.SomeFK NOT IN (SELECT RefToSameFK from Table4 WHERE ...)
Run Code Online (Sandbox Code Playgroud)
......或者他们的表现差不多?另外,有没有其他方法来构建这个查询更好?我通常不喜欢子查询,因为它们为查询添加了另一个"维度",它通过多项式因子增加运行时间.
我一直认为不存在是不是存在的方式,而不是使用不处于条件状态.但是,我对我一直在使用的查询进行比较,我注意到Not In条件的执行实际上似乎更快.任何有关为什么会出现这种情况的见解,或者如果我在此之前做出一个可怕的假设,我将不胜感激!
问题1:
SELECT DISTINCT
a.SFAccountID, a.SLXID, a.Name FROM [dbo].[Salesforce_Accounts] a WITH(NOLOCK)
JOIN _SLX_AccountChannel b WITH(NOLOCK)
ON a.SLXID = b.ACCOUNTID
JOIN [dbo].[Salesforce_Contacts] c WITH(NOLOCK)
ON a.SFAccountID = c.SFAccountID
WHERE b.STATUS IN ('Active','Customer', 'Current')
AND c.Primary__C = 0
AND NOT EXISTS
(
SELECT 1 FROM [dbo].[Salesforce_Contacts] c2 WITH(NOLOCK)
WHERE a.SFAccountID = c2.SFAccountID
AND c2.Primary__c = 1
);
Run Code Online (Sandbox Code Playgroud)
问题2:
SELECT
DISTINCT
a.SFAccountID FROM [dbo].[Salesforce_Accounts] a WITH(NOLOCK)
JOIN _SLX_AccountChannel b WITH(NOLOCK)
ON a.SLXID = b.ACCOUNTID
JOIN [dbo].[Salesforce_Contacts] c WITH(NOLOCK)
ON a.SFAccountID = c.SFAccountID …Run Code Online (Sandbox Code Playgroud) sql ×8
sql-server ×5
t-sql ×3
exists ×2
database ×1
mysqli ×1
oracle ×1
performance ×1
set-theory ×1
sql-in ×1