Wählen Sie nicht zusammenhängende Spalten aus zwei nicht zusammenhängenden Tabellen aus

StackOverflow https://stackoverflow.com//questions/25009499

  •  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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top