Frage

Ist es möglich, UNION-Abfragen von Tabellen oder Ansichten, die nicht gemeinsam kein Ergebnis haben? Was ich versuche zu tun, kombinieren Daten aus unterschiedlichen Ansichten zu einem Ergebnis. Ich habe

select a,b,null,c from VIEW1, VIEW2 where VIEW1.a = VIEW2.a
UNION
select null,null,z,null from VIEW3

Ich mag das Ergebnis a, b, z, c. Ist das, wo ich von den auserwählten verwenden würde? Was das bedeutet aus?

select ? from (
select a,b,null,c from VIEW1, VIEW2 where VIEW1.a = VIEW2.a
UNION
select null,null,z,null from VIEW3)

Ich bin mit MS SQL Server und die Ansichten haben keine Primärschlüssel. Vielen Dank.

War es hilfreich?

Lösung

Wenn ich verstehe Ihre Frage, sind Sie wahrscheinlich Ergebnisse wie diese bekommen:

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

.. aber was Sie versuchen, Ergebnisse wie diese zu bekommen sind:

a1, b1, z1, c1
a2, b2, z2, c2
a3, b2, z3, c3

Habe ich das Problem richtig verstanden?

Wenn dies richtig ist, werden Sie eine Möglichkeit haben müssen, um diese Unterabfragen miteinander zu verbinden, so dass Sie SQL sagen können, dass die 1'en zusammen gehen, und die 2 zusammen gehen, und so weiter.

Andere Tipps

Eine Union verknüpft Sätze führen, es ihnen nicht kombiniert werden.

Also, was Sie von Ihrer ersten Abfrage erhalten werden, ist dies:

  a      b    (null)  c
(null) (null)   z    (null)

Wenn Sie sie kombinieren wollen, müssen Sie sich ihnen anschließen müssen, und dann müssen Sie etwas gemeinsam haben, oder Sie werden die Daten im Programm kombinieren müssen.

Haben Sie haben nur 1 Zeile von jedem?

Wenn ja, dann, wenn das Muster oben immer so sein wird, das funktionieren würde:

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

Wenn Sie jedoch nicht wissen, ob View3.a einen Wert hat oder View1.a einen Wert hat, und Sie die eine von der ersten Abfrage wollen, wenn es ein Wert 3 ist, dann würde dies funktionieren:

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

Aber, und es gibt ein großes ABER hier drin. Wenn Sie mehr als eine Zeile in eine der beiden Ansichten haben, werden gehen Sie mit den Daten, die am Ende nicht zusammengehört. In diesem Fall Sie muss etwas gemeinsam haben.

Hier ist der vollständige Code, die ich versuchte, zusammen mit den Ergebnissen:

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

Ergebnisse:

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)

Wenn Sie fügen Sie eine einzelne Zeile zu View3, wie folgt aus:

INSERT INTO View3 (z) VALUES (51)

Dann werden Sie diese Ergebnisse erhalten, beachten Sie die verdoppelten Zeilen:

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)

Wenn ich das verstehen: versuchen Sie zu ‚Zusammenbruch‘ Ihre Ergebnisse und loszuwerden alle NULL-Werte? Wenn ja, wird jemals ergeben sich aus view3 zu einem Ergebnis von view1 / view2 entsprechen? Wenn ja, was ist die Beziehung? Wenn nicht, die Anzahl der Ergebnisse mindestens Match?


Für mehrere Datensätze, ROW_NUMBER () Ansatz für mich gearbeitet. Der Select-1 k Ansatz wurde ein kartesisches Produkt zurück.

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

Kann es sein, dass Sie für so etwas suchen? (Nur eine wilde Vermutung)

SELECT 
  VIEW1.a,
  VIEW1.b,
  (SELECT TOP 1 z FROM VIEW3) AS z,
  VIEW2.c
FROM
  VIEW1, VIEW2 
WHERE
  VIEW1.a = VIEW2.a

Die Ergebnisse aus beliebigen SQL wählen, darunter eine Vereinigung, sind eine statische Gruppe von Spalten. (Kein Polymorphismus).

Aber Sie müssen nicht alle Spalten in jeder Zeile verwenden möchten, verwenden Sie Nullwerte in den Zeilen, in denen die Spalte keinen Wert haben. Außerdem schlage ich vor, dass Sie eine ‚Typen‘ Reihe umfassen, damit der Client die Art sagen kann (und interessante Spalten) für eine bestimmte Zeile.

Beispiel:

 (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 
)

Sie wollen eigentlich eine Cross-Join:

select V1.P, v1.b, VIEW3.z, v1.c aus (SELECT a, b, c, FROM VIEW1, View2 wo VIEW1.a = VIEW2.a) als v1 CROSS JOIN View3

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top