Domanda

E 'possibile query UNION da tabelle o viste che non hanno alcun risultato in comune? Quello che sto cercando di fare è combinare dati provenienti da diversi punti di vista in un unico risultato. Ho

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

Vorrei che il risultato sia a, b, z, c. È qui che vorrei utilizzare selezionare dalla? Che cosa simile?

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

sto usando MS SQL Server e il punto di vista non hanno chiavi primarie. Grazie mille.

È stato utile?

Soluzione

Se ho capito la tua domanda, probabilmente stai ottenendo risultati come questo:

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

.. ma quello che si sta cercando di ottenere sono risultati come questo:

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

Ho capito il problema in modo corretto?

Se questo è corretto, è necessario avere un modo per unire questi sottointerrogazioni insieme, in modo che si può dire che lo SQL 1 andiamo insieme, ed il 2 di andare insieme, e così via.

Altri suggerimenti

A concatena sindacali risultano set, non combina loro.

Quindi, ciò che si otterrà dalla vostra prima domanda è questa:

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

Se si desidera combinare loro, si dovrà unirsi a loro, e poi avete bisogno di avere qualcosa in comune, o dovrete combinare i dati nel programma.

Hai solo 1 ferro a ciascuno?

Se è così, allora se il modello di cui sopra sta andando sempre essere così, questo dovrebbe funzionare:

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

Tuttavia, se non si sa se View3.a ha un valore o View1.a ha un valore, e si desidera quello della prima query se c'è un valore di 3, allora questo dovrebbe funzionare:

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

Ma, e c'è un grande MA qui. Se si dispone di più di una riga in uno dei punti di vista, si va a finire con i dati che non vanno insieme. In tal caso, è deve avere qualcosa in comune.

Ecco il codice completo che ho provato, insieme ai risultati:

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

Risultati:

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)

Se si aggiunge una singola riga di View3, in questo modo:

INSERT INTO View3 (z) VALUES (51)

Poi si otterrà questi risultati, notare le righe raddoppiato:

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)

Se ho capito questo: stai cercando di 'collasso' i risultati e di sbarazzarsi di tutti i NULL? Se è così, sarà sempre il risultato di view3 corrispondono ad un risultato da view1 / view2? Se sì, qual è il rapporto? In caso contrario, fare il numero di risultati almeno partita?

Per
più record, ROW_NUMBER () approccio ha funzionato per me. Il Select 1 k approccio stava tornando un prodotto cartesiano.

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

Può essere che siete alla ricerca di qualcosa di simile? (Solo un ipotesi)

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

I risultati da qualsiasi SQL SELECT, tra cui un sindacato, sono un insieme statico di colonne. (No polimorfismo.)

Ma non è necessario utilizzare tutte le colonne in ogni riga, si utilizza valori nulli nelle righe in cui la colonna non ha un valore. Propongo inoltre di includere una riga 'tipo' in modo che il cliente può dire il tipo (e le colonne interessanti) per una data riga.

Esempio:

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

In realtà si vuole un cross join:

selezionare v1.a, v1.b, VIEW3.z, v1.c da (SELECT a, b, c, DA Visualizzazione1 VIEW2 dove VIEW1.a = VIEW2.a) come v1 CROSS JOIN View3

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top