SQL Server / 2在相同的存储过程中选择

时间:2010-08-06 18:15:59

标签: sql sql-server tsql stored-procedures

以下是我在单个SQL Server过程中尝试做的事情:

@ID1 int

select ID2 from TableA where ID1 = @ID1

(for each selected @ID2)
    select * from TableB where ID2 = @ID2

有什么想法吗?

4 个答案:

答案 0 :(得分:10)

这可以在一个声明中完成:

SELECT b.*
  FROM TABLE_B b
  JOIN TABLE_A a ON a.id2 = b.id2
 WHERE a.id1 = @ID1

但这意味着如果TABLE_A中的多条记录与TABLE_B记录相关,则会有重复项。在这种情况下,使用EXISTS而不是将DISTINCT添加到上一个查询:

SELECT b.*
  FROM TABLE_B b
 WHERE EXISTS(SELECT NULL
                FROM TABLE_A a
               WHERE a.id2 = b.id2
                 AND a.id1 = @ID1)

IN子句是等效的,但如果有重复项,则EXISTS会更快:

SELECT b.*
  FROM TABLE_B b
 WHERE b.id2 IN (SELECT a.id2
                   FROM TABLE_A a
                  WHERE a.id1 = @ID1)

答案 1 :(得分:1)

试试这个:

select * from TableB b where exists (select top 1 * from TableA a where a.ID2 = b.ID2)

答案 2 :(得分:1)

SELECT * 
FROM TableB 
WHERE ID2 IN (SELECT ID2 FROM TableA WHERE ID1 = @ID1)

一般来说,您不希望在SQL Server中进行任何类型的循环。尝试使用“基于设置”操作。

答案 3 :(得分:-2)

对于sql中的每个不起作用,您必须使用游标。

declare @id int
declare @id2 int

declare mycursor cursor for
   select id2 from tablea where id=@id

open mycursor

fetch next from mycursor into @id2

while @@fetch_status = 0
 begin

   your code here

   fetch next from mycursor into @id2
 end
close mycursor
deallocate mycursor