2013-10-29 6 views
0

삽입 하나 개의 테이블 값은

테이블 myTbl를 가지고 쿼리하는
ID Number 
1 12458 
2 45896 
3 12458 
4 87456 

유무 쿼리와 같은 :

SELECT TOP 1 n.abonent_name , ad.address 
FROM dbo.names n 
INNER JOIN dbo.addresses ad on n.address_id = ad.id 
WHERE n.number = (every number from myTbl) 

다음 절 각 myTbl에서 수와 응답을 삽입 쿼리 에 삽입 원 가상 테이블에 각 번호에 대해 #tbl 예를 들어 을 #tbl abonent_name에 삽입하고 주소 = 12458는이 삽입 한 후 등 절은 다른 번호 45896 다음 #tbl에 삽입 곳에서 작성하고

CREATE TABLE #tbl 
(
    id identity(1,1), 
    abonent_name varchar(20), 
    address varchar(50) 
) 

답변

1
SELECT TOP 1 n.abonent_name , ad.address 
FROM dbo.names n 
INNER JOIN dbo.addresses ad on n.address_id = ad.id 
WHERE n.number IN (SELECT number from myTbl) 

위의 시도 커서없이 쓰기합니다. 하지만 한 돌로 두 마리의 새를 죽일 수 있습니다.

SELECT ROW_NUMBER() OVER (order by n.abonent_name) AS ID, n.abonent_name , ad.address 
INTO #tbl 
FROM dbo.names n 
INNER JOIN dbo.addresses ad on n.address_id = ad.id 
WHERE n.number IN (SELECT number from myTbl) 
+1

그러나 Top 1 절에 대해 혼란스러워합니다. 왜 Top 1을 사용 하시겠습니까? –

+0

대단히 감사합니다. – GeoVIP

0

커서를 사용할 필요가 없습니다. 는 addresses 표에 이름 당이 1 개 행이있을 경우, 다음과 같은 패턴을 사용할 수 있습니다

INSERT INTO #tbl (abonent_name, address) 
SELECT x.abonent_name, x.address 
from 
(
    SELECT 
     ROW_NUMBER() OVER (PARTITION BY n.abonent_name 
         ORDER BY n.abonent_name, x.address) AS RowNumber, 
     n.abonent_name, 
     ad.address 
    FROM dbo.names n 
    INNER JOIN myTbl tbl on n.number = tbl.number 
    INNER JOIN dbo.addresses ad on n.address_id = ad.id 
) x 
where x.RowNumber = 1 
order by x.RowNumber; 

이 코드는 #tbl 테이블에 각 이름의 첫 번째 (알파벳) 주소를 삽입 할 코드는 myTbl 테이블에 있습니다. 이름은 알파벳 순서로 오름차순으로 정렬됩니다. 조건 x.RowNumber=1은 일치하는 항목이 여러 개인 경우 첫 번째 주소를 필터링합니다.