2011-07-05 23 views
7

私はこのインタビューの中でこの質問をしました。 UNIONキーワードを使用してJOINを実行できますか? JOINキーワードを使用してUNIONを実行できますか?UNIONを使用したSQL - JOIN ?? JOINを使用したUNION?

つまり- 1. JOINキーワードを使用せずにUNIONキーワードを使用してJOINと同じ出力を得る必要がありますか? 2. UNIONキーワードを使用せずにJOINキーワードを使用してUNIONと同じ出力を取得する必要がありますか?

できるだけこれを行う方法の例を教えてもらえますか?

+0

EXISTSとSub selectを使って内部結合をシミュレートすることはできますが、UNION単独ではそうは思いません。 – Magnus

答えて

9

インタビューは、あなたの商品を設定するフレームワークです。覚えておいてください:質問に答えないでください)

記者会見を考えてください。スポークスパーソンは、journosの難しい質問に答えるつもりはありません。むしろ、彼らは既に解答を持っている質問を探しています。彼らは解放したい情報です(それ以上はありません)

私はインタビューでこの質問に直面した場合、私はリレーショナルそれが私がやりたいとのインタビューに行ったことがあるからです。私は "ここで関係代数について話す"という質問に気をつけています。これはそれです。

JOINは論理ANDの対応部分ですが、UNIONは論理ORの対応部分です。したがって、コンベンションロジックを使用した同様の質問は、「あなたはORを使用していますか? 「ANDを使用してORを使用できますか?」その答えは、他にどのように使用できるかによって異なります。 )

私は、プリミティブ演算子のセット、計算の完全性に必要な演算子のセット、実用に必要な演算子と簡体字のセットの違いについて議論したいと思うかもしれません。

質問に直接お答えしようとすると、さらに疑問が生じます。 JOINは関係代数では「自然結合」を意味しますが、SQLではINNER JOINを意味します。質問が特にSQLに関係する場合は、すべてのJOINの種類について回答する必要がありますか? UNION JOINはどうですか?

SQLの外部結合は、一例として、UNIONです。クリス日は、私が今までにしたいと考えてできるよりも、より良い、それを表現する:

外への参加明示その結果に 農産物ヌルに設計されており、 そのため、一般的には、避けるべきです。 はリレーショナル言えば、それは 散弾銃の結婚のようなものだ:それは、労働組合、イエスの種類に テーブルを強制的に、私は参加し-も、問題のテーブル は、労働組合のための 通常の要件に適合するために失敗した場合、 組合ない意味ですか( 第6章参照)。実際には のテーブルのいずれかまたは両方をヌルにパディングすることにより、 を作成し、結局それらのテーブルに従います。 「私はnullを憎む」、しかし、もし そのパディング が適切な値 の代わりに、ヌル

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

で行うことがない理由はありませんこれは良い議論のポイントだろうあなたが望んでいたものですインタビューで遭遇する!

これは、覚えているだけの思いです。重要な点は、これらの質問を聞くことによって、インタビュアーがあなたに支店を提供していることです。あなたはそれに何をぶつけますか? ;)

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 

(SQL Server 2008で書かれた)

UNION作品の両方SELECT文は、同じ数の列を持っている、と列は同じ(または少なくとも類似の)データ型を持っている場合。
UNIONSELECTステートメントが単一のテーブルからのみデータを選択している場合、またはそれらの一方または両方がすでに複数のテーブルにあるJOINである場合は気にしません。

+0

ああ..私は..あなたはUNIONを使わずにJOINと同じ出力を得ることを意味しましたか? 2. JOINキーワードを使用しないUNIONと同じ出力? – rkd

1

他の操作にも依存すると思います。私はよく覚えている場合、UNIONFULL 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

誤っていない場合は、「連合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 

は同じです:行が二つのソースの一つからのデータを含む場合

あなたが参加していことができる唯一の方法と連合の作品です型が一致して1列のみでこれを行う:

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を使用するように助言するのためのJOIN、ありますクエリは、あなたが他の方法で期待していたことをやっています。

+0

ありがとう!それは本当に助けになりました:) – rkd

関連する問題