2010-08-06 5 views
0

저는 여기에 하나의 SQL 서버 절차에 할 노력하고있어입니다 :SQL 서버/같은 저장 프로 시저에서 선택

@ID1 int 

select ID2 from TableA where ID1 = @ID1 

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

어떤 아이디어?

+0

테이블 구조와 필요한 출력은 무엇입니까? 뭐, 정확히하려고 했니? 여기? – AllenG

+0

TableB의 각 select에 대해 별도의 결과 집합을 원합니까? 아니면 모든 행을 포함하는 단일 결과 집합이 반환 되었습니까? – SqlRyan

+0

하나의 결과 집합이 필요합니다. – asmo

답변

10

. 그 상황에서 사용은 오히려 이전 쿼리에 DISTINCT 추가하는 대신 EXISTS :

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

IN 절은 동일하지만 중복이있는 경우 빨라집니다 존재합니다

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

및 A.ID1 = @ ID1 ... – Jonathan

1

이 시도 :

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

그러나이 TABLE_A에 하나 개 이상의 레코드가 TABLE_B 레코드에 관련된 경우 중복이된다는 것을 의미합니다 : 하나의 문으로 수행 할 수 있습니다

select * from TableB b where exists (select top 1 * from TableA a where a.ID2 = b.ID2) 
1
SELECT * 
FROM TableB 
WHERE ID2 IN (SELECT ID2 FROM TableA WHERE ID1 = @ID1) 

일반적으로 , 당신은 SQL Server에서 어떤 종류의 루핑도하고 싶지 않습니다. "Set based"작업을 사용해보십시오.

+0

코드 또는 XML을 게시하는 경우 텍스트 편집기에서 해당 줄을 강조 표시하고 편집기 도구 모음에서 "코드"단추 (101 010)를 클릭하여 멋지게 형식을 지정하십시오 구문 강조! –

+0

포맷팅은 SQL의 경우 매우 좋으므로 걱정하지 않아도됩니다. 진짜로 당신을 괴롭히는 경우에, 당신은 포스트를 편집하게 자유 롭다. – StingyJack

-2

sql에서 각각의 나던 한 작업에 대해 커서를 사용해야합니다.

declare @id int 
declare @id2 int 

declare mycursor cursor for 
    select id2 from tablea where [email protected] 

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 
+7

커서가 악합니다! – Jonathan

+0

코드 또는 XML을 게시하는 경우 ** 텍스트 편집기에서 해당 행을 강조 표시하고 편집기 툴바에서 "코드"버튼 (101 010)을 클릭하여 멋지게 형식을 지정하고 구문을 강조 표시하십시오! –

+0

아니요, 저는 항상 그것을 사용합니다. 그러나 절대로 그 문제는 없습니다. 단 하나의 절이 필요하다면 그는 존재하거나 조인 절을 사용할 수 있지만 커서와 forech는 같은 효과를냅니다 – elchente23

관련 문제