2011-07-05 5 views
7

인터뷰 중이 질문을 받았습니다. UNION 키워드를 사용하여 JOIN을 할 수 있습니까? JOIN 키워드를 사용하여 UNION을 할 수 있습니까?UNION을 사용하는 SQL - JOIN ?? JOIN을 사용하는 UNION?

즉 - 1. JOIN 키워드를 사용하지 않고 JOIN과 동일한 출력을 얻지 만 UNION 키워드를 사용해야합니까? 2. UNION 키워드를 사용하지 않고 UNION과 동일한 출력을 얻지 만 JOIN 키워드를 사용해야합니까?

가능한 경우이 작업을 수행하는 방법에 대한 예를 들려 줄 수 있습니까?

+0

내부 조인을 시뮬레이트하기 위해 EXISTS 및 Sub를 사용할 수 있지만 UNION만으로는 그렇게 생각하지 않습니다. – Magnus

답변

9

인터뷰는 귀하가 설정 한 프레임 워크입니다. 기억하십시오 : 질문에 대답하지 마십시오.)

기자 회견을 생각해보십시오. 대변인은 journos에서 어려운 질문에 대답하려고하지 않습니다.오히려 그들은 이미 답변을하고있는 질문을 찾고 있습니다. 더 이상 공개하지 않으려는 정보입니다.

인터뷰에서이 질문에 직면하게되면 관계형 지식을 증명하는 데 사용합니다. 대수학은 내가 그 의도와 인터뷰에 참여했기 때문입니다. 나는 "여기 관계형 대수에 관해 이야기해라."라는 질문에 대해 경고한다.

JOIN은 논리적 AND의 카운터 파트이며 UNION은 논리적 OR의 카운터 파트입니다. 따라서 컨벤션 로직을 사용하여 비슷한 질문을 할 수 있습니다. "OR을 사용하고 할 수 있습니까?" "AND를 사용하여 AND를 할 수 있습니까?" 그 대답은 당신이 사용할 수있는 다른 것에 달려 있습니다. }

나는 원시 연산자 집합, 계산 완전성에 필요한 연산자 집합과 실용적인 목적으로 필요한 연산자 집합과 단축 집합의 차이점에 대해서도 토론하고 싶다.

직접 질문에 대답하려고하면 추가 질문이 생깁니다. JOIN은 관계형 대수에서 '자연 조인'을 의미하지만 SQL에서는 INNER JOIN을 의미합니다. 질문이 특히 SQL과 관련된 경우 모든 JOIN 유형에 대해 대답해야합니까? UNION JOIN는 어떨까요?

예를 들어 SQL의 외부 조인은 UNION입니다. 크리스 날짜는 내가 희망 할 수있는 것보다 그것을 더 잘 표현하기 :

외부가 명시 적으로 그 결과에 생산 널 (null)로 설계되어 가입하고 따라서 일반적으로 피해야한다. 는 관계형가 산탄 총 결혼의 일종이다, 말하기 : 그것은 일종의으로 테이블 강제 노동 조합 - 예, 나는 조합을 의미합니까하지 조인도 문제의 테이블 노조에 대한 일반적인 요구 사항을 준수하지 않을 때 ( 6 장 참조). 사실 유니온을 수행하기 전에 테이블 중 하나 또는 모두를 null로 패딩하여 을 작성하여 결국 정규 조건을 준수하게 만듭니다. 그러나 그 패딩 "나는 널 싫어", 경우에 좋은 토론의 포인트가 될 것

SQL and Relational Theory, 1st Edition by C.J. Date

적절한 값 대신 널 (null)

으로 수행되어서는 안 할 이유가 없습니다 당신이 원하는 무언가가있다 인터뷰에서 건너 오기!

다음은 몇 가지 생각입니다. 중요한 점은 면접관이 여러분에게 지부를 제공한다는 것입니다. 너는 무엇에 매달릴거야? ;)

1

다음과 같은 것이 있습니까?

create table Test1 (TextField nvarchar(50), NumField int) 
create table Test2 (NumField int) 
create table Test3 (TextField nvarchar(50), NumField int) 

insert into Test1 values ('test1a', 1) 
insert into Test1 values ('test1b', 2) 
insert into Test2 values (1) 
insert into Test3 values ('test3a', 4) 
insert into Test3 values ('test3b', 5) 

select Test1.* 
from Test1 inner join Test2 on Test1.NumField = Test2.NumField 
union 
select * from Test3 

모두 SELECT 문이 동일한 수의 열이있을 때

UNION 작업 (SQL Server 2008에서 작성), 그리고 열은 동일 (또는 적어도 유사한) 데이터 유형이있다.
UNIONSELECT 문이 하나의 테이블에서만 데이터를 선택하거나 하나 또는 둘 다 이미 두 개 이상의 테이블에 JOIN 인 경우 상관하지 않습니다.

+0

오 .. 내가 말한 .. 당신은 UNION을 사용하지 않고 JOIN과 동일한 출력을 얻습니다. 2. JOIN 키워드를 사용하지 않고 UNION과 동일한 결과를 출력합니까? – rkd

1

다른 작업도 가능하다고 생각합니다.

내가 잘 기억한다면

UNION는이 FULL OUTER 조인을 사용하여 수행 할 수 있습니다 :이 같이

Table a (x, y) 

Table b (x, y) 

CREATE VIEW one 
AS 
SELECT a.x AS Lx 
    , b.x AS Rx 
    , a.y AS Ly 
    , b.y AS Ry 
FROM a FULL OUTER JOIN b 
     ON a.x = b.x 
     AND a.y = b.y 


CREATE VIEW unionTheHardWay 
AS 
SELECT COALESCE(Lx, Rx) AS x 
    , COALESCE(Ly, Ry) AS y 
FROM one 
+0

'1 = 0'에 가입하는 것은 어떨까요? – Magnus

+0

@Magnus :'1 = 0'에 대한 완전 외부 조인은'UNION'보다 많은 행을 만듭니다. 이것들은 어떻게 제거 될 것인가? –

+0

실수가 아니라면 'Union ALL'이 아닙니다. – Magnus

9

은 모두 이러한 기능에 대한 이해를 테스트하고, 면접 질문입니다.

예상되는 대답은 "일반적으로 서로 다른 작업을 수행 할 때 수행 할 수 없습니다."이며, 조합이 결과 집합의 끝에 행을 추가한다는 것을 설명함으로써이를 자세히 설명합니다. join은 추가 열을 추가합니다.

SELECT ISNULL(A.AA, '') AS AA, ISNULL(B.BB, '') AS BB FROM A 
FULL OUTER JOIN B ON 1=0 

또는에 :

SELECT A.AA, '' AS BB FROM A 
UNION ALL 
SELECT '' AS AA, B.BB FROM B 

는 것과 같습니다 행이 두 소스의 하나에서 데이터를 포함하는 경우

당신이 가입 할 수있는 유일한 방법과 연합 작품입니다 하나 개의 컬럼 만이 할 유형이 일치 여기서

SELECT A.AA AS TT FROM A 
UNION ALL 
SELECT B.BB AS TT FROM B 

가와 같습니다

당신이 데이터를 여러 테이블에 걸쳐 산란이 있지만 당신이 함께 TI 모두를보고 싶다면이 작업을 수행 할 것
SELECT ISNULL(A.AA, B.AA) AS TT 
FROM A 
FULL OUTER JOIN B ON 1=0 

한 경우 그러나 나는이 경우보다는 FULL OUTER에 UNION을 사용하도록 권합니다의 때문에 가입한다 쿼리는 다르게 예상 할 수있는 일을합니다.

+0

감사! 정말 도움이 :) – rkd

관련 문제