SQL Server内のUNION選択の結果
-
23-08-2019 - |
質問
それは共通で任意の結果を持っていないテーブルやビューからUNIONクエリすることは可能ですか?私は何をしようとしていることは、1つの結果に異なるビューからのデータを組み合わせることです。私が持っている
select a,b,null,c from VIEW1, VIEW2 where VIEW1.a = VIEW2.a
UNION
select null,null,z,null from VIEW3
私は、結果は、B、Z、Cになりたいです。私はから選択使用する場所ですか?何それはのように見えるのでしょうか?
select ? from (
select a,b,null,c from VIEW1, VIEW2 where VIEW1.a = VIEW2.a
UNION
select null,null,z,null from VIEW3)
私は、MS SQL Serverを使用していますし、ビューが主キーを持っていません。本当にありがとうございました。
解決
私はあなたの質問を理解していれば、あなたはおそらく、このような結果を得ている。
a1, b1, null, c1
a2, b2, null, c2
a3, b2, null, c3
null, null, z1, null
null, null, z2, null
null, null, z3, nul
L
..しかし、あなたは、このような結果は取得しようとしているもの:
a1, b1, z1, c1
a2, b2, z2, c2
a3, b2, z3, c3
私は問題を正しく理解していますか?
これが正しい場合は、1一緒に行き、そして2のは、ように一緒に行く、およびSQLを伝えることができるように、、あなたは、一緒にこれらのサブクエリを結合する方法を持っている必要があります。
他のヒント
組合を連結結果セットを、それはそれらを結合しません。
ですから、あなたの最初のクエリから得るものはこれです:
a b (null) c
(null) (null) z (null)
あなたがそれらを組み合わせたい場合は、は、あなたがそれらを結合する必要があります、そしてあなたが共通で何かを持っている必要があり、またはあなたがプログラムにデータを結合する必要があります。
あなただけのそれぞれから1行を持っていますか?
その場合は上記のパターンは常にそのようになるだろうされている場合、、そして、これは動作します:
SELECT SQ1.a, SQ1.b, SQ2.z, SQ1.c
FROM (
SELECT 1 k, View1.a, b, NULL z, c
FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
SELECT 1 k, NULL a, NULL b, z, NULL c
FROM View3) SQ2 ON SQ1.k = SQ2.k
値3がある場合は、しかし、あなたはView3.aが値を持っているかView1.aが値を持っているかどうかわからない、とあなたが最初のクエリから1をしたい場合は、これが動作します。
SELECT COALESCE(SQ1.a, SQ2.a) a, COALESCE(SQ1.b, SQ2.b) b,
COALESCE(SQ1.z, SQ2.z) z, COALESCE(SQ1.c, SQ2.c) c
FROM (
SELECT 1 k, View1.a, b, NULL z, c
FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
SELECT 1 k, NULL a, NULL b, z, NULL c
FROM View3) SQ2 ON SQ1.k = SQ2.k
しかし、大きなしかし、ここにはあります。あなたはビューのいずれかで複数の行を持っている場合は、一緒に属していないデータで終わるしようとしてます。その場合は、<全角> の共通点を持っている必要があります。
ここで私は結果とともに、試した完全なコードは次のとおりです。
USE master
GO
DROP DATABASE TestDB
GO
CREATE DATABASE TestDB
GO
USE TestDB
GO
CREATE TABLE View1
(
a INT,
b INT,
c INT
)
GO
CREATE TABLE View2
(
a INT,
z INT
)
GO
CREATE TABLE View3
(
z INT
)
GO
INSERT INTO View1 (a, b, c) VALUES (10, 20, 30)
GO
INSERT INTO View2 (a, z) VALUES (10, 40)
GO
INSERT INTO View3 (z) VALUES (50)
GO
SELECT View1.a, b, NULL z, c
FROM View1 INNER JOIN View2 ON View1.a = View2.a
UNION
SELECT NULL a, NULL b, z, NULL c
FROM View3
SELECT SQ1.a, SQ1.b, SQ2.z, SQ1.c
FROM (
SELECT 1 k, View1.a, b, NULL z, c
FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
SELECT 1 k, NULL a, NULL b, z, NULL c
FROM View3) SQ2 ON SQ1.k = SQ2.k
SELECT COALESCE(SQ1.a, SQ2.a) a, COALESCE(SQ1.b, SQ2.b) b,
COALESCE(SQ1.z, SQ2.z) z, COALESCE(SQ1.c, SQ2.c) c
FROM (
SELECT 1 k, View1.a, b, NULL z, c
FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
SELECT 1 k, NULL a, NULL b, z, NULL c
FROM View3) SQ2 ON SQ1.k = SQ2.k
結果:
a b z c
----------- ----------- ----------- -----------
NULL NULL 50 NULL
10 20 NULL 30
(2 row(s) affected)
a b z c
----------- ----------- ----------- -----------
10 20 50 30
(1 row(s) affected)
a b z c
----------- ----------- ----------- -----------
10 20 50 30
(1 row(s) affected)
あなたはこのように、View3に1つの行を追加する場合:
INSERT INTO View3 (z) VALUES (51)
次に、あなたが倍増した行に気づく、これらの結果を得ることができます
a b z c
----------- ----------- ----------- -----------
NULL NULL 50 NULL
NULL NULL 51 NULL
10 20 NULL 30
(3 row(s) affected)
a b z c
----------- ----------- ----------- -----------
10 20 50 30
10 20 51 30
(2 row(s) affected)
a b z c
----------- ----------- ----------- -----------
10 20 50 30
10 20 51 30
(2 row(s) affected)
:あなたは「崩壊」にあなたの結果をしようとしているし、すべてのNULLを取り除きますか?その場合はVIEW1 / VIEW2から結果に対応し、これまでview3から生じるのだろうか?もしそうならば、関係は何ですか?ない場合は、少なくとも試合の結果の数を行う?
複数のレコードについては、ROW_NUMBER()のアプローチは、私のために働きました。選択1 kのアプローチは、デカルト積を返した。
SELECT SQ1.a, SQ1.b, SQ2.z, SQ1.c
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY a) k, View1.a, b, NULL z, c
FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
SELECT ROW_NUMBER() OVER (ORDER BY b) k, NULL a, NULL b, z, NULL c
FROM View3) SQ2 ON SQ1.k = SQ2.k
それはあなたがこのような何かを探しているということはできますか? (ちょうど野生の推測)
SELECT
VIEW1.a,
VIEW1.b,
(SELECT TOP 1 z FROM VIEW3) AS z,
VIEW2.c
FROM
VIEW1, VIEW2
WHERE
VIEW1.a = VIEW2.a
任意のSQLからの結果は、組合を含む、選択した列の静的なセットです。 (いいえ多型。)
しかし、あなたは、列が値を持たない列にnull値を使用し、各列内のすべての列を使用する必要はありません。私はまた、クライアントが指定した行のタイプ(と面白いコラムを)伝えることができるので、あなたは「タイプ」列が含まれることを示唆しています。
例:
(Select
'room' as view_type
, rooms.room as room
, NULL as color
From rooms
)
UNION ALL
(Select
'color' as view_type
, NULL as room
, colors.color as color
From colors
)
あなたが実際にクロスが参加したい:
を選択しv1.a、v1.b、VIEW3.z、v1.cから V1と(VIEW1、VIEW2 VIEW1.a = VIEW2.aから、B、Cの選択) CROSS JOINを VIEW3