Seleccione columnas no relacionadas de dos tablas no relacionadas
-
20-12-2019 - |
Pregunta
¿Existe una manera fácil de seleccionar dos columnas de dos tablas no relacionadas para usar esas columnas en una inserción?
Descargo de responsabilidad:Idealmente, nunca necesitaría hacer esto porque el esquema se habría configurado con algo llamado "claves externas" e "integridad referencial".Pero parece que ninguno de estos conceptos existía en el planeta en el que se creó este esquema.
Aquí hay una versión simplificada de lo que necesito hacer:
Mesa de clientes
Id Name
------------
1 Eddie
2 Stone
3 Mike
Tabla de productos
Id Name
---------------------
100 Drum sticks
101 Guitar strings
102 Amplifier
Tabla de facturas
Id CustomerName ProductName
---------------------------------------
1000 Eddie Guitar Strings
1001 Mike Amplifier
En mi código SQL, tengo un :CustomerId
y un :ProductId
, e idealmente me gustaría hacer algo como esto:
INSERT Invoice (
Id,
CustomerName,
ProductName
)
SELECT
:InvoiceId,
Customer.Name,
Product.Name
FROM
Customer,
Product
WHERE
Customer.CustomerId = :CustomerId
and Product.ProductId = :ProductId
Esto funciona muy bien si existen los registros de Cliente y Producto, pero también necesito atender el escenario en el que uno de ellos no existir.(Sí, en serio.)
La única manera que se me ocurre de hacerlo es declarando variables como :CustomerName
y :ProductName
y rellenarlos previamente fuera de la declaración de inserción.
¿Hay alguna manera de lograr esto sin recurrir al enfoque de variables adicionales?
Solución
Podrías hacer esto:
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
Otros consejos
Junto a la respuesta proporcionada por Arion, podrías usar un FULL OUTER JOIN
con una condición de unión que siempre es cierta.Esto sólo funciona correctamente si ambas subconsultas generan una sola fila.
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