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?

È stato utile?

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
.

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