Wählen Sie nicht zusammenhängende Spalten aus zwei nicht zusammenhängenden Tabellen aus
-
20-12-2019 - |
Frage
Gibt es eine einfache Möglichkeit, zwei Spalten aus zwei unabhängigen Tabellen auszuwählen, um diese Spalten in einer Einfügung zu verwenden?
Haftungsausschluss:Im Idealfall müsste ich das nie tun, da das Schema mit etwas namens „Fremdschlüssel“ und „referenzieller Integrität“ eingerichtet worden wäre.Aber es scheint, als ob keines dieser Konzepte auf dem Planeten existierte, auf dem dieses Schema erstellt wurde.
Hier ist eine vereinfachte Version dessen, was ich tun muss:
Kundentisch
Id Name
------------
1 Eddie
2 Stone
3 Mike
Produkttabelle
Id Name
---------------------
100 Drum sticks
101 Guitar strings
102 Amplifier
Rechnungstabelle
Id CustomerName ProductName
---------------------------------------
1000 Eddie Guitar Strings
1001 Mike Amplifier
In meinem SQL-Code habe ich eine :CustomerId
und ein :ProductId
, und im Idealfall würde ich gerne so etwas machen:
INSERT Invoice (
Id,
CustomerName,
ProductName
)
SELECT
:InvoiceId,
Customer.Name,
Product.Name
FROM
Customer,
Product
WHERE
Customer.CustomerId = :CustomerId
and Product.ProductId = :ProductId
Das funktioniert gut und gut, wenn sowohl der Kunden- als auch der Produktdatensatz vorhanden sind, aber ich muss auch das Szenario berücksichtigen, in dem einer davon vorhanden ist nicht existieren.(Ja wirklich.)
Die einzige Möglichkeit, die ich mir vorstellen kann, besteht darin, Variablen wie zu deklarieren :CustomerName
Und :ProductName
und sie außerhalb der insert-Anweisung vorab auszufüllen.
Gibt es eine Möglichkeit, dies zu erreichen, ohne den Ansatz der zusätzlichen Variablen zu verwenden?
Lösung
Sie könnten Folgendes tun:
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
Andere Tipps
Neben der Antwort von Arion könnten Sie a verwenden FULL OUTER JOIN
mit einer Join-Bedingung, die immer wahr ist.Dies funktioniert nur dann korrekt, wenn beide Unterabfragen eine einzelne Zeile erzeugen.
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