SQL mehrere Spalten in der Ansicht aus einer einzigen Tabelle-Spalte
Ich versuche, erstellen Sie eine Ansicht in SQL Server 2008 R2, auf denen die Daten extrahiert aus zwei Tabellen mit dual eins-zu-eins-Beziehungen, und ich möchte zwei Spalten in der Sicht Werte aus einer einzelnen Spalte in einer der Tabellen.
Die Tabellen sind aktuell ähnlich wie in diesen Beispielen:
TableA:
PrimaryKey | Name | Value_FK | Number_FK
-------------------------------------------
66 | NameA | 1 | 2
77 | NameB | 3 | 4
TableB:
PrimaryKey | Value
-------------------
1 | 238
2 | 456
3 | 100
4 | 200
Sollte die Ansicht so Aussehen:
Name | Value | Number
-------------------------
NameA | 238 | 456
NameB | 100 | 200
('Value' und 'Reihe' sind im wesentlichen die gleiche Art, und beides findet in der 'Wert' - Spalte in TableB eingerichtet. Ich dachte, es wäre mehr leicht zu distingiush zwischen 'Wert' und 'Zahl', als 'Werta" und "Wertb').
Der Faktor, der darüber entscheiden sollte, welche Werte gehen in die Spalte 'Wert' oder in der Spalte 'Nummer' ist der Primärschlüssel in Tabelle B und seine Referenzen in beiden foreignkey in TableA (aber die beiden FKs wird NIE beziehen sich auf den gleichen Schlüssel).
Dies ist wahrscheinlich nicht die brillanteste Datenbank-Modell mit dual-Beziehungen zwischen den Tabellen. Dies ist jedoch aufgrund der Zuordnung einiger C#.NET Klassen zu einer Datenbank mithilfe von ADO.NET Entity Framework, wo der Klasse A hat zwei Objekte der Klasse B (in diesem Fall mit dem Namen 'Wert' und 'Anzahl') und das Datenbank-Modell derzeit Konstrukte zwei Beziehungen, weil dieser. Ändern, ist dies keine option.
Ich habe versucht zu googeln, aber ich finde es schwierig, eine Antwort zu finden, die ich brauche. Vor allem wenn die meisten Ergebnisse sind in etwa das Gegenteil: die Auswahl mehrerer Spalten in eine Spalte.
So, wie soll ich schreiben, die Select-Anweisung?
CREATE VIEW ViewName
AS
SELECT DISTINCT a.Name as 'Name', ????? as 'Value', ????? as 'Number'
FROM TableA a, TableB b
Ich bin ziemlich rostig mit fortgeschrittenen SQL-Befehle. Es ist schon über 1,5 Jahre seit dem letzten war ich in etwas so weit. Ich habe versucht, etwas ähnliches wie das erste:
CREATE VIEW ViewName
AS
WITH Name AS
( SELECT DISTINCT a.Name FROM TableA a )
Value AS
(
SELECT DISTINCT b.Value as 'Value' FROM TableA a, TableB b
WHERE b.PrimaryKey = an.ValueA_FK
),
Number AS
(
SELECT DISTINCT b.Value as 'Number'
FROM TableA a, TableB b
WHERE a.PrimaryKey = an.ValueB_PrimaryKey
)
SELECT DISTINCT
* FROM Name, Value, Number
Das Ergebnis meiner völlig fehlgeschlagenen Versuch ist wie folgt:
Name | Value | Number
-------------------------
NameA | 100 | 200
NameB | 100 | 200
NameA | 100 | 456
NameB | 100 | 456
NameA | 238 | 200
NameB | 238 | 200
NameA | 238 | 456
NameB | 238 | 456
Nun suggestiong als das, was zum ausfüllen der Abfrage?
- Zuerst verwenden Sie niemals implizite joins sind Sie eine SQL-antipattern. Sie sind eher worng und viel härter im Laufe der Zeit zu pflegen. Sie sind auch mehr als 20 Jahre out von date.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie auf die gleiche Tabelle mehr als einmal in der
FROM
Klausel:Habe ich auch entfernt
DISTINCT
, da sollte es nicht zur Gewohnheit hinzuzufügen, und es gibt nichts in der Frage, die nahelegt, dass eine notwendig ist. Ich habe auch verwendet, ANSI-Style-joins. Diese sind fast immer bevorzugt werden gegenüber den älteren Stil (wo die Tabellen in derFROM
- Klausel sind nur durch Kommata getrennt)Wenn es möglich ist, dass einige Zeilen in
TableA
haben eineNULL
Value_FK
oderNumber_FK
, und Sie immer noch wollen, dass diese Zeilen in der Ansicht, Sie würden wechseln Sie eine oder beide derinner join
sleft join
s. Sie würden dann auch entscheiden, ob die Ausgabe-Spalte sollteNULL
(in dem Fall sind Sie fertig) oder einen anderen Wert (in dem Fall müsstest du z.B.COALESCE(b1.Value,<Value when null>) as 'Value'
).OR
basiert Prädikat, dann eine pseudo-pivot mitMAX(CASE ...
dann split aus den verschiedenen join-Bedingungen in getrennte Spalten. Es ist nicht ein Ansatz, den ich empfehlen würde wenn. Und Sie kann richtig sein, über möglicherweise wollenLEFT JOIN
s, aber wenn, dass eine Anforderung, die OP ist noch nicht angegeben.Dieses query zu Ergebnissen führen, die Sie wollen:
Sie kompliziert Ihre Abfrage eine Menge.