2009-06-05 5 views
2

, 당신은 (같은 무언가) 언급 할 수TSQL에이 쿼리 구문의 구현이 있습니까? 일부 SQL 언어에서

SELECT * FROM SomeTable WHERE (val1,val2) IN 
    (SELECT val1,val2 FROM SomeOtherTable) 

을하지만 내가 사용하고있는 TSQL (SQL 서버 2K)에서 그렇게하는 방법을 모르겠어요.

조인 또는 연결된 값 (예 : )을 사용하는 등의 해결 방법을 알고 있지만 (지금은 사용 중임) TSQL에 일부 구문이 있습니까?

업데이트 : 이것은 유효한 SQL-99 구문이므로, 성능이 더 좋을지라도 조인은 해결 방법이라고 생각합니다. 제 질문은 아마도 다음과 같이 더 좋을 것입니다 :

TSQL에이 구문이 구현되어 있습니까?

UPDATE2 : 나는 방금이 구문 옴 Mysql을 테스트하고 잘 작동합니다.

+0

나는 조인을 _workaround_를 사용하여 호출하지 않을 것이다. SQL 전문가는 아니지만 JOIN이 IN을 사용하는 것보다 훨씬 빠를 것이라고 확신합니다. – Rake36

+0

@Rake ​​: IN 절에 따라 다릅니다. 이 경우, 이들을 subselect로 분할하면 (실제로 행 필터링을 사용하면) 조인보다 속도가 느려집니다. – Eric

+2

@Rake ​​: SQL Server는 최적화 할 수 있습니다. 특별한 경우를 위해 특별히 설계된 특별한 SEMI JOIN 알고리즘이 있습니다. 그것은 후속 DISTINCT가있는 JOIN보다 빠릅니다. – Quassnoi

답변

10
SELECT * 
FROM SomeTable st 
WHERE EXISTS 
     (
     SELECT 1 
     FROM SomeOtherTable sot 
     WHERE sot.val1 = st.val1 
       AND sot.val2 = st.val2 
     ) 

이는 IN 구조가 어떤 SEMI JOIN 방법에 최적화되어 어떤 사실이다. 귀하의 질문에 관해서는

,

T-SQL에서이 구문의 구현이 있습니까?

대답은 documentation으로 없는

입니다 말한다 :

... 하나 칼럼의 결과 세트가 subquery을. 이 열의 데이터 형식은 test_expression이어야합니다.

+0

+1, 좋은 대체품이지만 여전히 질문에 대한 대답이 없습니다 – Peter

+0

tx. – Peter

+2

@ 피터 : 어떻게 그런 짧은 코멘트를 했습니까? – Quassnoi

1

가입 방법은 여기에 있습니다.

0

IN은 단일 열 배열에서만 작동합니다.

SELECT * FROM SomeTable 
WHERE val1 IN (SELECT val1 FROM SomeOtherTable WHERE val2 = SomeTable.val2) 
AND val2 IN (SELECT val2 FROM SomeOtherTable WHERE val1 = SomeTable.val1) 

체크 아웃 그것에 documentation : 당신은 명시 적으로 IN 절을 할 것을 주장했다입니다. 각 행 (예 :-WHERE SomeOtherTable.ID = SomeTable.MyOtherID)에 의존하는 where 절이 있기 때문에 성능이 좋고 참여가 절대적으로 좋은 방법입니다.

+0

일치하지 않는 val1과 val2가 SomeOtherTable의 다른 행에서 올 수 있기 때문에 –

+0

그럴 필요는 없습니다. SomeOtherTable에 val1과 일치하지만 val2가 아닌 행이 있고 다른 값과 일치 할 수있는 다른 행이있는 한 일치하는 행을 줄 수 있습니다. – TheTXI

+0

* 조엘에게 화가 난 주먹을 흔들다 * – TheTXI

4

해당 구문의 SQL Server 구현이 없습니다. 당신은 이런 식으로 뭔가를해야 할 것이다 :

SELECT st.* 
FROM SomeTable st 
    INNER JOIN 
    (
    SELECT val1, val2 
    FROM SomeOtherTable 
    GROUP BY val1, val2 
) sot ON sot.val1= st.val1 AND sot.val2 = st.val2 
+0

단일 버전이 아닙니까? 심지어 2008 년? – Peter

+0

아니요, 2008 년이 아닙니다. –

0
Select SomeTable.* 
FROM SomeTable, SomeOtherTable 
WHERE SomeTable.Val1 = SomeOtherTable.Val1 
    And SomeTable.Val2 = SoemeOtherTable.Val2 

당신은 이것을 고려하지한다 "해결." 이것은 당신이 성취하고자하는 것을 성취하는 가장 기본적이고 표준적인 방법입니다.

편집 : 표준 "JOIN"구문이 아닐 수도 있지만 습관입니다.

+1

SomeOtherTable에 SomeTable의 레코드와 일치하는 val1 및 val2 열이있는 레코드가 둘 이상있는 경우 중복 결과가 발생할 수 있습니다. –

+1

또한 "Table1, Table2"구문을 downvote하고 싶습니다. –

+0

좋은 지적 Joel. 중복 된 결과가 불필요한 부작용이 될 것이라고 생각하지 않았습니다. – TheTXI