2016-04-12 13 views
2

Ich habe vier verschiedene Tabellen, die ich abzufragen versuche, die erste Tabelle ist, wo ich die meisten Abfragen tun werde, aber wenn es keine Übereinstimmung im Auto gibt, bin ich in anderen suchen Felder in den anderen Tabellen, um festzustellen, ob eine Übereinstimmung mit einem VIN-Parameter vorliegt.Sollte ich beitreten oder sollte ich UNION

Beispiel:

Select 
    c.id, 
    c.VIN, 
    c.uniqueNumber, 
    c.anotheruniqueNumber 
FROM Cars c, Boat b 
WHERE 
    c.VIN = @VIN(parameter), 
    b.SerialNumber = @VIN 

Jetzt sagen, dass ich kein Spiel in Cars haben, aber es gibt eine Übereinstimmung in Boat, wie würde ich in der Lage sein, den passenden Boot Record vs Auto Rekord zu ziehen? Ich habe versucht, die Tabellen zu verbinden, aber die Tabellen haben keinen eindeutigen Bezeichner, um auf die andere Tabelle zu verweisen.

Ich versuche herauszufinden, was die beste Möglichkeit ist, alle Tabellen von einem Parameter zu suchen, aber mit der geringsten Menge an Code. Ich dachte über UNION ALL, aber nicht sicher, ob das, was ich wirklich für diese Situation wollen, da die Anzahl der Datensätze extrem groß werden könnte.

Ich verwende derzeit SQL Server 2012. Danke im Voraus!

AKTUALISIERT:

CAR table 
ID VIN    UniqueIdentifier  AnotherUniqueIdentifier 
1 2002034434  HH54545445   2016-A23 
2 2002035555  TT4242424242   2016-A24 
3 1999034534  AGH0000034   2016-A25 


BOAT table 
ID SerialNumber Miscellaneous 
1 32424234243  545454545445 
2 65656565656  FF24242424242 
3 20023232323  AGH333333333 

Erwartetes Ergebnis, wenn @VIN Parameter eine Boot-Kennung übereinstimmt:

BOAT 
ID SerialNumber Miscellaneous 
2 65656565656  FF24242424242 
+1

Beispieldaten und das erwartete Ergebnis würden helfen –

+1

Normalerweise wird 'JOIN' für Daten verwendet, die eine definierte Beziehung haben. zB: Kurse und Studenten. Da möglicherweise keine Cars Towing Boats vorhanden sind, gibt es keine Referenzbeziehung, so dass ein 'JOIN' hier nicht zutrifft. –

+4

Bitte bitte, bitte, verwenden Sie diese veraltete [Join-Syntax.] (Http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins .aspx) – Zane

Antwort

3

Irgendeine Art von union all vielleicht der beste Ansatz sein - zumindest die schnellste mit dem rechten Indizes:

Select c.id, c.VIN, c.uniqueNumber, c.anotheruniqueNumber 
from Cars c 
where c.VIN = @VIN 
union all 
select b.id, b.VIN, b.uniqueNumber, b.anotheruniqueNumber 
from Boats b 
where b.VIN = @VIN and 
     not exists (select 1 from Cars C where c.VIN = @VIN); 

Dies setzt voraus, dass Sie die entsprechenden Spalten in jeder der Tabellen haben (was Ihrer Frage entspricht).

Die Kette not exists kann länger werden, wenn Sie weitere Entitätstypen hinzufügen. Ein einfacher Weg ist, um zu tun, statt Sortierung - vorausgesetzt, Sie nur eine Zeile wollen:

select top 1 x.* 
from (Select c.id, c.VIN, c.uniqueNumber, c.anotheruniqueNumber, 1 as priority 
     from Cars c 
     where c.VIN = @VIN 
     union all 
     select b.id, b.VIN, b.uniqueNumber, b.anotheruniqueNumber, 2 as priority 
     from Boats b 
     where b.VIN = @VIN 
    ) x 
order by priority; 

Es gibt einen leichten Overhead für die order by. Aber ehrlich gesagt ist die Reihenfolge von 1 bis 4 Zeilen aus Performance-Sicht trivial.

+0

Das geht davon aus, dass "Boats" und "Cars" die gleichen Spalten haben, aber trotzdem +1. –

+0

Wie effektiv wäre es, 'NULL's zu den Spalten hinzuzufügen, die nicht übereinstimmen? Denn wie ich schon sagte, würde ich meistens auf 'Autos' und nicht wie sonst auf den anderen Tischen nachfragen. Würde das Hinzufügen von 'NULL' zu den anderen Tabellen in UNION zu Problemen führen? –

+1

@ Programmierer117. . . Wenn eine Spalte in den anderen Tabellen nicht vorhanden ist, verwenden Sie definitiv "NULL" als Platzhalter. –