2016-12-06 2 views
0

Ich habe zwei Tabellen:Wie verwenden Sie eine UNION von zwei Tabellen als Spalte in einer anderen Tabelle?

  • Staaten (AZ, CA, WA, dergleichen)
  • Etwas Ähnliches zu Staaten, mit Ausnahme aller char (3) IDs

brauche ich eine Tabelle, muss beide mit einem Fremdschlüssel in einer anderen Tabelle, wo beide eine gültige Eingabe sein können, verweisen.
Wie kann ich das tun? Oder gibt es eine bessere Übung, um so etwas zu tun?

Meine aktuelle Methode speichert nur einen vChar von bis zu 3 und dann eine Ansicht der beiden anderen Tabellen.

"Diese Frage bezieht sich weniger auf das Schlüsselwort" union "und mehr darauf, wie man einen Fremdschlüssel in einer Spalte hat, die auf ZWEI Tabellen verweist. Etwas, das nicht möglich ist. OP möchte also wissen, wofür es die beste Vorgehensweise ist etwas "wie" das tun. "
Wie Ainas gesagt haben, ist dies genau richtig.

Mehr auf, was ich versuche
zu tun, da ich nicht herausfinden kann, wie eine Tabelle formatieren hier ist ein Beispiel dessen, was ich mit den Daten zu tun:

 Table 1 
------------------------ 
StateCodes Desc 
------------------------ 
AZ   Arizona 
CA   California 
NY   New York 
etc  etc 

     Table 2 
------------------------ 
Char3Codes Desc 
------------------------ 
JUR  Jurusalem 
ABP  A Black Panda 
QRM  QR Monument 
etc  etc 

     Table 3 
------------------------ 
ComboColumn No Desc Column 
------------------------ 
    AZ   
    CA   
    NY   
    JUR 
    ABP 
    QRM 

Dann Mit Table3 sollte ich in der Lage sein, die Beschreibung aus den ursprünglichen zwei Tabellen schnell zu bekommen.

+0

können Sie JOIN für diese – Dekel

+0

verwenden Bearbeiten Sie Ihre Frage und bieten Beispieldaten und gewünschte Ergebnisse. Es ist schwer zu visualisieren, was Sie zu tun versuchen. Deine Methode ist in Ordnung. Sie können sogar eine indizierte Sicht erstellen. –

+0

kann beides gleichzeitig gültige Eingabe sein? – Hogan

Antwort

1

Wenn Sie Geschwindigkeit wollen, eine Ansicht erstellen und dann einen Index für sie erstellen:

create view v_allcodes with shemabinding as 
    select StateCode as code, Description 
    from table1 
    union all 
    select Char3Code, Description 
    from table2; 

create index idx_v_allcodes_code_description on v_allcodes(code, description); 

dann tun einfach:

select t3.*, c.description 
from table3 t3 join 
    v_allcodes c 
    on t3.combocode = c.code; 

Der Index der Ansicht bleibt automatisch auf dem neuesten Stand, wenn sich die zugrunde liegenden Daten ändern - das ist die "Magie" der materialisierten Ansichten. Es ist dann so schnell wie mit einer Tabelle.

3

Wenn nur eine Eingabe gleichzeitig gültig sein kann und eine Spalte verwendet wird, funktioniert dies. Ich würde die Joins so mit Coalesce und keine Union verwenden.

SELECT COALESCE(J1.VALUE, J2.VALUE) as Lookup 
    FROM TABLE T 
    LEFT JOIN STATES J1 ON T.FKEY = J1.CODE 
    LEFT JOIN OTHERTABLE J2 ON T.FKEY = J2.CODE 

Natürlich kann man das Gleiche mit zwei Tasten tun (was meiner Meinung nach die bessere Lösung) Dies verbessert Ihr Design durch eine bessere Trennung von Bedenken mit:

SELECT COALESCE(J1.VALUE, J2.VALUE) as Lookup 
    FROM TABLE T 
    LEFT JOIN STATES J1 ON T.FKEY1 = J1.CODE 
    LEFT JOIN OTHERTABLE J2 ON T.FKEY2 = J2.CODE 
+0

Lassen Sie mich auch eine Stimme für Option 2 anbieten. Option 1 ist wirklich eklig IMO. Option 1 bedeutet, dass es überhaupt keine FK-Beschränkung gibt. Ich würde auch eine Prüfbedingung für die Spalten hinzufügen, um sicherzustellen, dass nur eine Spalte nicht null ist. – aquinas

Verwandte Themen