SqlServer选择其中的位置

时间:2014-04-03 15:13:06

标签: sql sql-server

我已经在这个问题上投了一个循环,想知道我是否完全理解选择使用位置或者我是否只是在这段代码中做了一个嘘声:

DECLARE @driver TABLE (ID INT)
INSERT INTO @driver select eventid from event where event_code_name IS NULL
select eventid from event where eventid in (select eventid from @driver)

事件表中共有3137条记录。有458条记录的event_code_name字段为空。在上面的选择中,我期待458,但我反而收回了所有的事件记录。

我错过了什么?

5 个答案:

答案 0 :(得分:3)

我认为(select eventid from @driver)应为(select id from @driver)

答案 1 :(得分:1)

由于您使用的是2个表,一个是虚拟的,一个是物理的,因此解决方案是使用INNER JOIN子句:

DECLARE @driver TABLE (ID INT)
INSERT INTO @driver SELECT eventid FROM event WHERE event_code_name IS NULL
SELECT eventid FROM event INNER JOIN @driver ON id = event.eventid

这样,您只能获取事件表和@driver表中存在的ID。 INNER JOIN比使用IN (SELECT ...)

更有效率

不使用@driver表,您可以使用INSERT语句中使用的SELECT查询获得相同的结果:

SELECT eventid FROM event WHERE event_code_name IS NULL

答案 2 :(得分:0)

你错过了DISTINCT吗?

从偶数进入的事件中选择DISTINCT eventid(从@driver选择偶数)

答案 3 :(得分:0)

可能值得对可能包含空值的所有列执行ISNULL并过滤掉ISNULL的默认值。

答案 4 :(得分:0)

有时使用IN运算符效率较低,特别是如果子查询中的列是Nullable IN运算符可以显示一些非常意外的结果。

我建议使用EXSITS,就像这样...

select eventid 
from [event] 
where EXISTS (select 1 
              from @driver
              WHERE id = [event].eventid)

对于这个特定的查询,你真的不需要一个表变量。你可以简单地选择你的桌子,就像这样......

SELECT eventid 
FROM [event]
WHERE event_code_name IS NULL