Seleziona colonne non correlate da due tabelle non correlate
-
20-12-2019 - |
Domanda
C'è un modo semplice per selezionare due colonne da due tabelle non correlate, al fine di utilizzare quelle colonne in un inserto?
.Disclaimer : Idealmente, non avrei mai bisogno di farlo perché lo schema sarebbe stato allestito con un po 'di qualcosa chiamato "chiavi straniere" e "integrità referenziale". Ma sembra che nessuno dei due concetti esistesse sul pianeta su cui è stato creato questo schema.
Ecco una versione semplificata di ciò che devo fare:
Tabella cliente
Id Name
------------
1 Eddie
2 Stone
3 Mike
.
Tabella del prodotto
Id Name
---------------------
100 Drum sticks
101 Guitar strings
102 Amplifier
.
Tabella della fattura
Id CustomerName ProductName
---------------------------------------
1000 Eddie Guitar Strings
1001 Mike Amplifier
.
Nel mio codice SQL, ho un :CustomerId
e un :ProductId
, e idealmente mi piacerebbe fare qualcosa del genere:
INSERT Invoice (
Id,
CustomerName,
ProductName
)
SELECT
:InvoiceId,
Customer.Name,
Product.Name
FROM
Customer,
Product
WHERE
Customer.CustomerId = :CustomerId
and Product.ProductId = :ProductId
.
funziona bene e dandy Se esistono sia i record del cliente che dei prodotti, ma ho bisogno di soddisfare anche lo scenario in cui uno di loro non è . (Sì, davvero.)
L'unico modo in cui posso pensare di farlo è dichiarare variabili come :CustomerName
e :ProductName
e pre-popolandoli al di fuori dell'istruzione Inserisci.
C'è un modo per raggiungere questo obiettivo senza scendere l'approccio in più variabili?
Soluzione
Potresti farlo:
INSERT Invoice (
Id,
CustomerName,
ProductName
)
SELECT
:InvoiceId,
(
SELECT
Customer.Name
FROM
Customer
WHERE
Customer.CustomerId = :CustomerId
),
(
SELECT
Product.Name
FROM
Product
WHERE
Product.ProductId = :ProductId
)
FROM RDB$DATABASE
. Altri suggerimenti
Accanto alla risposta fornita da Arion, è possibile utilizzare un FULL OUTER JOIN
con una condizione di join sempre vera.Questo funziona correttamente se entrambi i subqueri producono una singola riga.
SELECT
:InvoiceId,
CustomerName,
ProductName
FROM (
SELECT CustomerName
FROM Customer
WHERE CustomerId = :CustomerId
) a
FULL OUTER JOIN (
SELECT ProductName
FROM Product
WHERE Product.ProductId = :ProductId
) b
ON 1 = 1
.