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?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top