SQL Server / 2 выбрать в той же хранимой процедуре - PullRequest
0 голосов
/ 06 августа 2010

Вот что я пытаюсь сделать в одной процедуре SQL Server:

@ID1 int

select ID2 from TableA where ID1 = @ID1

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

Есть идеи?

Ответы [ 4 ]

10 голосов
/ 06 августа 2010

Это можно сделать одним оператором:

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 голос
/ 06 августа 2010
SELECT * 
FROM TableB 
WHERE ID2 IN (SELECT ID2 FROM TableA WHERE ID1 = @ID1)

Вообще говоря, вы не хотите выполнять какие-либо циклы в SQL Server. Попробуйте использовать операции «Set based».

1 голос
/ 06 августа 2010

Попробуйте это:

select * from TableB b where exists (select top 1 * from TableA a where a.ID2 = b.ID2)
0 голосов
/ 06 августа 2010

Для каждого не работает в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...