2012-05-10 2 views
1

새내기 질문입니다. 내가 얻을 것일치하는 열 선택

c1|c2|c3 
1 | a|v3 
2 | b|v4 
2 | c|v5 
3 | d|v6 

:

c1|c2|c3 
1 | a|v1 
2 | b|v2 
2 | c|v5 

누구나 알고

c1|c2|c3 
1 | a|v1 
2 | b|v2 

및 T2 : 나는 T1이있는 경우 이렇게

SELECT c1,c2,c3 FROM TABLE t1 
UNION 
SELECT c1,c2,c3 FROM TABLE t2 WHERE t1.c1 IS NOT NULL AND t1.c2 IS NULL; 

: 내가 좋아하는 뭔가를하고 싶어 어떻게해야합니까?

+0

나는 왼쪽 C1하지 T1에서, 예를 들어,와 행을 포함 할 것이다 가입하고 얻을 수있는 최선을 3 | d | v6 또는 t1에없는 c2를 갖는 행을 제외시키는보다 엄격한 조건을 가진 왼쪽 조인. 2 | c | v5 – NotGaeL

+1

내 대답을 참조하십시오. 나는 그것을 시험해 보았다. http://sqlfiddle.com/#!2/dc795/7 –

답변

2

는 SQL 문서에 따르면, JOIN 빠르게 그 SubQueries입니다. 이 시도 :

SELECT c1, c2, c3 
FROM t1 
UNION 
SELECT b.c1, b.c2, b.c3 
FROM t1 a inner join t2 b ON 
     (a.c1 = b.c1) and (a.c1 = b.c1) 
WHERE (b.c1,b.c2) NOT IN (SELECT c1,c2 FROM t1) 

증명하기 위해 여기를 참조 : http://sqlfiddle.com/#!2/50a4e/23

+0

답변은 정확하지만 내 테이블에서는 작동하지 않으며 그 이유는 모르겠습니다. 두 테이블에서 동일한 c1 및 c2 값을 반복하므로 결과는 입니다. c1 | c2 | c3 1 | a | v1 2 | b | v2 2 | c | v5 1 | a | v3 2 | b | v4 대신 : c1 | c2 | c3 1 | a | v1 2 | b | v2 2 | c | v5 – NotGaeL

+0

테이블의 데이터가 예제와 동일하지 않기 때문입니다. –

+0

피들 (http://sqlfiddle.com/#!2/50a4e/1)의 각 테이블에 하나의 값을 추가하여 문제를 재현했습니다. 행 | c1 | c2) = | 1 | 'b'|를 볼 수 있습니다. 값 v1.2 및 v3.2로 반복됩니다. | 1 | 'b'| v1.2 |, t1에서 하나의 행이어야합니다. 행 1 | 'a'에 대해서도 마찬가지입니다. t1과 t2에서. – NotGaeL

2

쿼리는 다음과 유사해야합니다. 그러나 얼마나 효율적인지는 확실하지 않습니다.

SELECT 
    T1.c1, 
    T1.c2, 
    T1.c3 
FROM T1 
UNION  
SELECT 
    T2.c1, 
    T2.c2, 
    T2.c3 
FROM T2 
WHERE ((T2.c1,T2.c2) NOT IN (SELECT t1.c1,t1.c2 FROM t1)) AND 
(T2.c1 IN (SELECT t1.c1 FROM t1)) 
+0

Nope. 이 쿼리에서 t2의 다른 c1에 대해 c2 값이 반복되면 첫 번째 c1에 대해서만 선택됩니다. 나는 c1이 t1에서 선택되었지만 (c1, c2)는 그렇지 않고 c2가 개별적으로 아닌 t2에서 모든 쌍 c1, c2를 선택하는 것과 같은 t1에서부터 내 선택에 결합하려고합니다. – NotGaeL

+0

(지금은 아직 올바른 해결책이 아니므로 여전히 효율적이지는 않습니다.) – NotGaeL

0
select t2.c1,t2.c2,t2.c3 
from t1,t2 
where t1.c1=t2.c2;