2016-07-11 7 views
0

ich drei Tabellen A, B und C in einem SQL-Server habe, B und C den gleichen Fremdschlüssel (AgencyID) von A und sie einen gleichen Spaltennamen auch gemeinsam nutzen: AgencyNameErstellen eine Spalte für eine Ansicht aus zwei verschiedenen Tabellen (SQL Server)

Tabelle A: AgencyID, AgencyDate,

Tabelle B: AgencyID, 012., Agency

Tabelle C: AgencyID, AgencyInvoiceNumber, Agency

Sie die Beziehung verstehen zu helfen, im Grunde sind diese drei Tabellen mit generierten Entity Framework, wo B und C jeweils erweitert A.

Jetzt versuche ich, einen Blick von diesen drei Tabellen in der folgenden Art und Weise zu erstellen:

CREATE VIEW [rdo].[Agencies] AS 
SELECT 
    A_1.AgencyID, A_1.AgencyDate, 
    dbo.B.AgencyNumber, dbo.B.AgencyName, 
    dbo.C.AgencyInvoiceNumber, dbo.C.AgencyName 
FROM dbo.A AS A_1 LEFT OUTER JOIN 
     dbo.B ON A_1.AgencyID = dbo.B.AgencyID LEFT OUTER JOIN 
     dbo.C ON A_1.AgencyID = dbo.C.AgencyID 

nun anscheinend die Skriptfehler über AgencyName dass Spaltennamen in einer Ansicht sollten eindeutig sein :(Wie würde ich Gehen Sie so vor, dass beide AgencyName Werte von B und C in einer Ansicht zusammengeführt werden?

Hinweis: Ich weiß, das Beispiel ist nicht perfekt, wie man die Spalte nur in Tabelle A verschieben kann, aber es ist nur ein vereinfachtes Beispiel, in Wirklichkeit kann ich wirklich nicht einfach die Spalte verschieben :(


Grund für die mit Spalten haben in B und C dupliziert:

Hier ist die Beziehungen:

  A 
     /\ 
      A1 A2 
     / \ 
     B  C 

A1 und A2 erstreckt A, B und C A1 und A2 erstreckt sind. AgencyName ist ein einzigartiges Attribut, das nur B und C hat. Ich weiß, dass hier ein Refactoring durchgeführt werden könnte, um diese seltsame Hierarchie loszuwerden, aber dieses Legacy-Projekt ist bereits zu groß geworden und ich kann mir die Kosten nicht leisten.

+0

Ich verstehe Ihr Geschäft nicht, aber ich fand, dass [AgenturID] das gleiche ist. warum verwendest du nicht [INNER JOIN] – TinhNQ

+0

wenn du entity framwork 6 verwendest, dann brauchst du nicht join bro .... du kannst direkt auf thoe 2 tables zugreifen –

+0

Du solltest deinen Agency Namen besser nicht zweimal eingeben, da es gleich ist . – Lucky

Antwort

1

Try COALESCE mit dem ersten nicht null Agency holen:

CREATE VIEW [rdo].[Agencies] AS 
SELECT 
    A_1.AgencyID, A_1.AgencyDate, 
    dbo.B.AgencyNumber, 
    COALESCE(dbo.B.AgencyName, dbo.C.AgencyName) As AgencyName, 
    dbo.C.AgencyInvoiceNumber 
FROM dbo.A AS A_1 LEFT OUTER JOIN 
     dbo.B ON A_1.AgencyID = dbo.B.AgencyID LEFT OUTER JOIN 
     dbo.C ON A_1.AgencyID = dbo.C.AgencyID 

Sie können die Frage stellen, wo in Agency B & C unterscheidet, in dem Fall, dass Sie eine Reihe von Regeln müssen folgen. Ich empfehle, AgencyName nur in einer der Tabellen (Tabelle A?) Zu haben, da andernfalls potenzielle Diskrepanzen bei der Aktualisierung auftreten.

+0

Genau was ich brauchte. Vielen Dank –

1

Geben Sie unterschiedliche Namen für diese Spalten in der Ansicht, deren Name wie in Tabellen gleich sind unter

CREATE VIEW [rdo].[Agencies] AS 
SELECT 
    A_1.AgencyID, A_1.AgencyDate, 
    dbo.B.AgencyNumber, dbo.B.AgencyName AS AgencyName_B, 
    dbo.C.AgencyInvoiceNumber, dbo.C.AgencyName AS AgencyName_C 
FROM dbo.A AS A_1 LEFT OUTER JOIN 
     dbo.B ON A_1.AgencyID = dbo.B.AgencyID LEFT OUTER JOIN 
     dbo.C ON A_1.AgencyID = dbo.C.AgencyID 
+0

Gibt es eine Möglichkeit, dies zu tun, ohne ihnen zwei verschiedene Namen zu geben? –

1
CREATE VIEW [rdo].[Agencies] AS 
SELECT 
    A_1.AgencyID, A_1.AgencyDate, 
    dbo.B.AgencyNumber, dbo.B.AgencyName as AgencyNameB, 
    dbo.C.AgencyInvoiceNumber, dbo.C.AgencyName as AgencyNameC, 
FROM dbo.A AS A_1 LEFT OUTER JOIN 
     dbo.B ON A_1.AgencyID = dbo.B.AgencyID LEFT OUTER JOIN 
     dbo.C ON A_1.AgencyID = dbo.C.AgencyID 

alice name zu AgencyName Säule geben. In Ihrem Fall wird die Tabelle dbo.table.AgencyName eine Spalte namens 'AgencyName' für die Tabellen B und C haben. Das ist das Problem. Gib Alicename für jede Spalte oder beide.

+0

Gibt es eine Möglichkeit, dies zu tun, ohne ihnen zwei verschiedene Namen zu geben? –

+0

@JoelMin, Sie müssen zwei Spalten AgencyName haben. ? oder den AgencyName von B und C zusammenführen und nur eine AgencyName-Spalte haben? – Backtrack

+0

Ich muss den AgencyName von B und C zusammenführen und habe nur einen AgencyName :) –