2016-09-03 9 views
0

Ich habe diese Abfragen:Beziehung zwischen zwei Tabellen, die eine Eins-zu-viele-Beziehung in SQL haben

SELECT   
    dbo.Lines.Unit, dbo.Lines.LineNumber, dbo.Lines.DocumentNumber, 
    dbo.BaseMaterials.Name AS MaterialName, 
    dbo.MaterialDescriptions.Name AS MaterialDescription, 
    dbo.MaterialDescriptions.Description, 
    dbo.MaterialScopes.ScopeName, dbo.MaterialScopeObjectNames.ObjectName, 
    dbo.MaterialDescriptions.Size1, dbo.MaterialDescriptions.Size2, 
    dbo.MaterialDescriptions.ItemCode, dbo.Materials.Quantity, 
    dbo.Materials.Discipline, dbo.Materials.Id, dbo.Lines.Id AS LineId 
FROM 
    dbo.Materials 
INNER JOIN 
    dbo.Lines ON dbo.Materials.LineId = dbo.Lines.Id 
INNER JOIN 
    dbo.BaseMaterials ON dbo.Lines.BaseMaterialId = dbo.BaseMaterials.Id 
INNER JOIN 
    dbo.MaterialDescriptions ON dbo.Materials.MaterialDescriptionId = dbo.MaterialDescriptions.Id 
INNER JOIN 
    dbo.MaterialScopes ON dbo.MaterialDescriptions.MaterialScopeId = dbo.MaterialScopes.Id 
INNER JOIN 
    dbo.MaterialScopeObjectNames ON dbo.MaterialDescriptions.MaterialScopeObjectId = dbo.MaterialScopeObjectNames.Id 

Es gibt 16000 Datensätze. Ich habe eine andere Tabellen mit joints Namen, der auf lineId haben jede material eine Beziehung mit material Tabelle hat multi joints so meine Frage, wenn ich joints Tabelle hinzufügen ist wie folgt:

SELECT   
    dbo.Lines.Unit, dbo.Lines.LineNumber, dbo.Lines.DocumentNumber, 
    dbo.BaseMaterials.Name AS MaterialName, 
    dbo.MaterialDescriptions.Name AS MaterialDescription, 
    dbo.MaterialDescriptions.Description, dbo.MaterialScopes.ScopeName, 
    dbo.MaterialScopeObjectNames.ObjectName, dbo.MaterialDescriptions.Size1, 
    dbo.MaterialDescriptions.Size2, dbo.MaterialDescriptions.ItemCode, 
    dbo.Materials.Quantity, dbo.Materials.Discipline, dbo.Materials.Id, 
    dbo.Lines.Id AS LineId, dbo.Joints.TestPackageId 
FROM 
    dbo.Materials 
INNER JOIN 
    dbo.Lines ON dbo.Materials.LineId = dbo.Lines.Id 
INNER JOIN 
    dbo.BaseMaterials ON dbo.Lines.BaseMaterialId = dbo.BaseMaterials.Id 
INNER JOIN 
    dbo.MaterialDescriptions ON dbo.Materials.MaterialDescriptionId = dbo.MaterialDescriptions.Id 
INNER JOIN 
    dbo.MaterialScopes ON dbo.MaterialDescriptions.MaterialScopeId = dbo.MaterialScopes.Id 
INNER JOIN 
    dbo.MaterialScopeObjectNames ON dbo.MaterialDescriptions.MaterialScopeObjectId = dbo.MaterialScopeObjectNames.Id 
INNER JOIN 
    dbo.Joints ON dbo.Materials.LineId = dbo.Joints.LineId 

Wie Sie in der letzten Zeile sehen kann ich machen eine Verbindung zwischen joints und materials die testpackageid Spalte in joints Tabelle zuzugreifen .aber mein Ergebnis liefert 220000records .Wie ich die Join-Typ ändern kann ich left oder right bedeuten, kehrt nur 16000 Datensätze mit seiner testpackageId

Antwort

2

Sie können JOIN nicht verwenden. Sie können jedoch CROSS APPLY mit:

FROM . . . 
    dbo.MaterialScopeObjectNames 
    ON dbo.MaterialDescriptions.MaterialScopeObjectId = dbo.MaterialScopeObjectNames.Id CROSS APPLY 
    (SELECT TOP 1 j.* 
     FROM dbo.Joints j 
     WHERE dbo.Materials.LineId = j.LineId 
    ) J 

Normalerweise würden Sie eine ORDER BY umfassen bei der Verwendung von TOP, so dass Sie eine gewisse Kontrolle über die Reihe haben zurückgegeben werden.

Beachten Sie auch, dass die Verwendung von Tabellenaliasnamen die Abfrage einfacher zu schreiben und zu lesen macht.

+0

Vielen Dank lieber Freund –

1

Sie können es sehr einfach mit nur einer Unterabfrage bekommen. Lassen Sie Ihre Abfrage unverändert und fügen Sie eine Unterabfrage hinzu, um diese Informationen von Joints abzurufen.

SELECT  dbo.Lines.Unit, dbo.Lines.LineNumber, dbo.Lines.DocumentNumber, dbo.BaseMaterials.Name AS MaterialName, dbo.MaterialDescriptions.Name AS MaterialDescription, dbo.MaterialDescriptions.Description, 
         dbo.MaterialScopes.ScopeName, dbo.MaterialScopeObjectNames.ObjectName, dbo.MaterialDescriptions.Size1, dbo.MaterialDescriptions.Size2, dbo.MaterialDescriptions.ItemCode, dbo.Materials.Quantity, 
         dbo.Materials.Discipline, dbo.Materials.Id, dbo.Lines.Id AS LineId, 
         (select top 1 dbo.Joints.TestPackageId from dbo.Joints where dbo.Joints.LineId = dbo.Materials.LineId) 
FROM   dbo.Materials INNER JOIN 
         dbo.Lines ON dbo.Materials.LineId = dbo.Lines.Id INNER JOIN 
         dbo.BaseMaterials ON dbo.Lines.BaseMaterialId = dbo.BaseMaterials.Id INNER JOIN 
         dbo.MaterialDescriptions ON dbo.Materials.MaterialDescriptionId = dbo.MaterialDescriptions.Id INNER JOIN 
         dbo.MaterialScopes ON dbo.MaterialDescriptions.MaterialScopeId = dbo.MaterialScopes.Id INNER JOIN 
         dbo.MaterialScopeObjectNames ON dbo.MaterialDescriptions.MaterialScopeObjectId = dbo.MaterialScopeObjectNames.Id 
+0

Vielen Dank. Ja, ich weiß, aber ich dachte, vielleicht gibt es eine bessere Lösung. –

Verwandte Themen