2016-05-26 12 views
0

Sprache: T-SQL
Server: SQL Server 2008 R2 - SQL Server 2014SQL - Abfrage mehrere Dissimilar Tabellen (nicht UNION)

Ich habe, was auf Basis hier ein an anderer Stelle suchen, erscheint entweder ein einzigartiges Problem zu sein oder ich kann nicht richtig verbalisieren, was ich zu erreichen versuche. Ich würde gerne über mehrere ungleiche Tabellen mit unterschiedlichen Feldstrukturen abfragen und sie zu einer einzigen anderen Tabelle verbinden. Wir haben eine Tabelle der ASSETS tb_assets und eine Tabelle der LIZENZEN tb_licenses. Ich würde gerne über diese beiden Fragen und JOIN sie in die Tabelle der VENDORS tb_vendors.

So:

----------------------      --------------------------- 
|  TB_ASSETS  |      | TB_LICENSES   | 
----------------------      --------------------------- 
| f_assetvendor  | <~~~    ~~~> | f_licensevendor   | 
| f_assettag   | |    | | f_licensename   | 
| f_assetname  | |    | | f_licenseexpirationdate | 
|     | |    | | f_licensequantity  | 
---------------------- |    | --------------------------- 
          |    | 
        ~~~~~~~~    ~~~~~~~~~~ 
        | ---------------------- | 
        | |  TB_VENDORS  | | 
        | ---------------------- | 
        ~~> | f_vendorGUID  | <~~ 
         | f_vendorname  | 
         ---------------------- 

Für ein kurzes Beispiel, ich für einen Herstellernamen (f_vendorname) von Amazon suchen will, würde Ich mag gegen tb_assets als auch die Abfrage gegenüber tb_licenses. Die Abfrage habe ich unten mit Invalid column name 'f_assetvendor' Fehler versucht, damit ich etwas falsch mache.

SELECT 
    f_assetvendor AS 'AssetVendor', f_licensevendor as 'LicenseVendor' 
FROM 
    tb_assets, tb_licenses 
LEFT JOIN 
    tb_vendors assven ON assven.f_vendorGUID = f_assetvendor 
LEFT JOIN 
    tb_vendors licven ON licven.f_vendorGUID = f_licensevendor 
WHERE 
    f_vendorname LIKE '%Amazon%' 

In Bezug auf meinen Titel „nicht UNION“ besagt, ich keine UNION hier, weil mit UNION Spaltennamen für die Ergebnismenge aus der ersten Abfrage getroffen werden kann, müssen die Spalten die gleichen Datentypen haben, und beide Tabellen müssen die gleiche Anzahl von Spalten haben.

+2

[Schlechte Gewohnheiten zu treten: mit altem Stil JOIN] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) - diese alte * durch Kommas getrennte Liste von Tabellen * style wurde durch die * richtige * ANSI 'JOIN'-Syntax im ANSI - ** 92 ** SQL Standard ersetzt (** mehr als 20 Jahre **) und deren Verwendung wird abgeraten. Und du solltest ** definitiv NICHT die beiden Stile mischen! Bleib am richtigen ANSI JOIN - immer. –

+0

@marc_s, Ich kann die beiden oberen Tabellen nicht zusammen verbinden, da sie keine Spalten haben, auf denen sie sich miteinander verbinden können. – Beems

+2

@Beems Sie können CROSS – JamieD77

Antwort

1

Geben Sie ein zu gehen diese;

SELECT 
    v.f_vendorGUID, 
    v.f_vendorname, 
    a.f_assetvendor AssetVendor, 
    l.f_licensevendor LicenseVendor 
FROM 
    TB_VENDORS v 
JOIN 
    TB_ASSETS a ON v.f_vendorGUID = a.f_assetvendor 
JOIN 
    TB_LICENSES l ON v.vendorGUID = l.f_licensevendor 
WHERE 
    v.vendorname LIKE '%Amazon%' 

Sie die TB_VENDORS als Haupttabelle verwenden kann und die beiden anderen Tabellen es kommen, in diesem Fall (INNER JOIN) gibt es keine besondere Reihenfolge, wie sie in sein sollte. Sie haben in Ihrem Diagramm gezeigt, dass es eine Verknüpfung zwischen diesen Tabellen. Wenn Sie die Möglichkeit haben, Daten in TB_ASSETS oder TB_LICENCES zu vermissen, verwenden Sie LEFT JOIN anstelle von JOIN.

Bitte setzen Sie sich aus der Gewohnheit des alten Stil verbinden Sie in Ihrer FROM-Anweisung verwendet haben, ist es eine wirklich alte Art und Weise, es zu tun.

+0

Sorry @Rich, ich habe mich vorher geirrt. Dadurch werden die Ergebnisse der Tabellen "Assets" und "Licenses" zusammengeführt, was ich vermeiden musste.Wenn ich zum Beispiel eine Lizenz und ein Asset habe, das dem Amazon-Anbieter entspricht, gibt es eine einzelne Zeile zurück und fügt diese hinzu. Wenn ich zwei Assets und eine Lizenz habe, bekomme ich zwei Zeilen. – Beems

+1

Ich bin mir sicher, dass es eine Möglichkeit gibt, das zu tun, was Sie wollen. Bitte geben Sie einige Beispieldaten für die Tabellen und die gewünschte Ausgabe an. Ich überarbeite dann meine Antwort, um Ihnen die gewünschten Ergebnisse zu geben. –

0

Ich weiß, Sie sagte nein zu einer Aussage Vereinigung aber ich denke, das gibt Ihnen, was Sie brauchen, wenn ich Ihre Frage bin Missverständnis.

Select [t].[Vendor] 
     , [t].[VendorType] 
From (Select [f_assetvendor] As 'Vendor' 
        , 'Asset' As 'VendorType' 
      From  [tb_assets] 
        Left Join [tb_vendors] [assven] 
         On [assven].[f_vendorGUID] = [f_assetvendor] 
      Union All 
      Select [f_licensevendor] As 'Vendor' 
        , 'License' As 'VendorType' 
      From  [tb_licenses] 
        Left Join [tb_vendors] [licven] 
         On [licven].[f_vendorGUID] = [f_licensevendor] 
     ) [t] 
Where [t].[Vendor] Like '%Amazon%'; 

Wie auch immer Sie dorthin kommen, Sie müssen Ihre Tabellen ähnlich genug machen, um zusammen Bericht zu erstatten.