質問

それは共通で任意の結果を持っていないテーブルやビューから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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top