2016-12-12 3 views
1

ich eine Abfrage mit der folgenden Struktur:Wie nur für mehrteilige nicht leer Ergebnisse zurückgeben Abfrage

DECLARE @VARIABLE as varchar(30) 
SET @VARIABLE = 'Thing to look up' 

select * from ref.Table1 where columnX = @VARIABLE 
select * from ref.Table2 where columnX2 = @VARIABLE 
... 
select * from ref.TableN where columnXn = @VARIABLE 

ich es verwenden viele Referenztabellen zu überprüfen, die alle verschiedenen Spalten haben, aber die Verwendung der gleiche Identifier, den ich mit @VARIABLE suche.

Es gibt 50+ Tabellen, die ich überprüfe. Ich möchte nur Ergebnisse zurückgeben, wenn es eine Übereinstimmung mit @VARIABLE in dieser bestimmten Tabelle gibt.

Ich bin kein Entwickler, aber ich bin mir sicher, dass es einen "programmatischen" Weg gibt, dies zu tun. Was ist eine empfohlene Methode?


edit:

Um klar zu sein, meine aktuelle Abfrage funktioniert in der SQL Server 2012-Benutzeroberfläche, wo ich meinen Tag zu Tag Arbeit zu tun. Ich führe die Abfrage aus, und ich bekomme ungefähr 50 Tabellen zurück. Die meisten haben nichts angepasst, also sehe ich nur den Header. Ich möchte nur die Tische zurückgeben, wo es eine Übereinstimmung gibt.

+1

wahrscheinlich benötigen Sie 'UNION ALL 'Zeigen Sie uns Beispieldaten und erwartete Ausgabe. \t Bitte lesen Sie [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t Und hier ist ein großartiger Ort, um [** START **] (http://spaghettiba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) um zu erfahren, wie Sie die Qualität Ihrer Fragen verbessern und bessere Antworten erhalten. –

+0

Eine Frage - müssen Sie wissen, welche Tabelle (n) die Referenz gefunden wurde, oder nur die Tatsache, dass sie gefunden wurde? Wenn Sie die Tabelleninformationen benötigen, möchten Sie dies möglicherweise als Rückgabewert in den Zeilen fest codieren. Wie Juan Carlos Oropeza sagte, eine UNION oder UNION ALL ist der Weg, um dies zu tun - UNION, wenn Sie nur wissen wollen, existiert es, UNION ALL, wenn Sie wissen wollen, wie oft es existiert. –

+0

@JuanCarlosOropeza, Danke. Wie bereits erwähnt, sind die Spalten unterschiedlich, so dass dies nicht funktioniert. Ich werde das How-To-Ask noch einmal lesen. Prost – ColinMac

Antwort

1

Ok, es scheint, als wäre dies eine Ad-hoc-Abfrage, die Sie in einem Frontend wie Query Analyzer oder Visual Studio ausführen.

Sie können eine if-Anweisung verwenden, und falls vorhanden, wie folgt aus:

IF EXISTS(select * from ref.Table1 where columnX = @VARIABLE) 
    select * from ref.Table1 where columnX = @VARIABLE 
; 

Um nur die Abfrage einmal zu laufen, es zu beschleunigen tun:

select * from ref.Table1 INTO #mytmp1 where columnX = @VARIABLE 

IF EXISTS(SELECT * FROM #mytmp1) 
    SELECT * FROM #mytmp1 
; 

Als @LaughingVergil weist darauf hin, Sie könnten ein Problem haben, wenn Ihre ID nicht in der ersten Tabelle ist, die Sie so lösen können:

select Table1.*, Table2.*, Table3.*, TableN.* 
from (
    SELECT @VARIABLE as Criteria 
) base 
left join ref.Table1 where columnX = base.Criteria 
left join ref.Table2 where columnX2 = base.Criteria 
left join ref.Table3 where columnX3 = base.Criteria 
-- ... 
left join ref.TableN where columnXN = base.Criteria 

zu "erkennen" welche Tabellendaten kommt aus

select 
    Table1.Field1 as Table1.Field1, Table1.Field2 as Table1.Field2, -- etc 
    Table2.Field1 as Table2.Field1, Table2.Field2 as Table2.Field2, -- etc 
    Table3.Field1 as Table3.Field1, Table3.Field2 as Table3.Field2, -- etc 
    TableN.Field1 as TableN.Field1, TableN.Field2 as TableN.Field2 -- etc 
from (
    SELECT @VARIABLE as Criteria 
) base 
left join ref.Table1 where columnX = base.Criteria 
left join ref.Table2 where columnX2 = base.Criteria 
left join ref.Table3 where columnX3 = base.Criteria 
-- ... 
left join ref.TableN where columnXN = base.Criteria 

ursprüngliche Antwort

Regel in SQL verwenden wir JOINs für diese Art von Situation (Sie muss wahrscheinlich genauer über Spalten sein, es sei denn, Sie interessieren sich nicht für mehrere Spalten mit dem gleichen Namen)

DECLARE @VARIABLE as varchar(30) 
SET @VARIABLE = 'Thing to look up' 

select Table1.*, Table2.*, Table3.*, TableN.* 
from ref.Table1 
left join ref.Table2 where columnX2 = columnX 
left join ref.Table3 where columnX3 = columnX 
-- ... 
left join ref.TableN where columnXN = columnX 
where columnX = @VARIABLE 

Oft wird eine Ansicht verwendet, um es einfacher zu machen (hier müssen Sie bestimmte Spaltennamen angeben oder die Erstellungsansicht wird fehlschlagen).

create view myview as 
select Table1.*, Table2.*, Table3.*, TableN.* 
from ref.Table1 
left join ref.Table2 where columnX2 = columnX 
left join ref.Table3 where columnX3 = columnX 
-- ... 
left join ref.TableN where columnXN = columnX 

dann

select * 
from myview 
where columnX = @VARIABLE 
+1

Sie haben eine ungerechtfertigte Annahme, dass der gesuchte Artikel in Tabelle1 gefunden werden muss. Die Struktur WHERE columnx = @VARIABLE erfordert, dass das Element in Table1 gefunden wird. Außerdem kann diese Form von SELECT stark explodieren. Sie fügen alle Spalten in einer Zeile hinzu, doch SQL Server hat eine Datenlängenbeschränkung pro Zeile. Eine UNION [ALL] ist der richtige Weg, um diese Art von Abfrage durchzuführen. –

+0

@LaughingVergil - Union schlägt fehl, wenn in jeder Tabelle verschiedene Spalten vorhanden sind. In der Regel - es sei denn, der Benutzer hat eine schreckliche Design-Wahl getroffen. Siehe Bearbeiten zur Lösung des von Ihnen angesprochenen Problems. – Hogan

+0

Vielleicht vielleicht nicht. Es hängt von der Definition der Tabellen ab und was nachgeschlagen wird. Zum Beispiel habe ich eine Anzahl von Systemen gesehen, in denen mehrere Abteilungen oder "Firmen" in mehrere identische Datenbanken aufgeteilt sind. Wenn die Benutzerfrage nach einem Kunden sucht, der in einer anderen Abteilung zum Zweck der gemeinsamen Nutzung von Daten vorhanden sein kann, dann wären die Spalten höchstwahrscheinlich identisch. Wir haben nicht genug Informationen zu sagen. Es gibt auch das damit verbundene Problem möglicher doppelter Spaltennamen in Mehrfach-Tabellen, ein Zeilenformat, das ein Programm verwirren kann, das die Daten liest. –

0

Ihr grundlegendes Abfrageformular sollte - Wenn Sie die Tabellen wollen, dass die Referenz in:

SELECT 'Table1', * FROM Table1 WHERE columnx = @VARIABLE 
UNION 
SELECT 'Table2', * FROM Table2 WHERE columnx2 = @VARIABLE 
UNION ... 
SELECT 'TableN', * FROM TableN WHERE columnxN = @VARIABLE 

Wenn Sie wollen wissen, ob es in jedem besteht aus die Tabellen:

SELECT * FROM Table1 WHERE columnX = @VARIABLE 
UNION 
SELECT * FROM Table2 WHERE columnX2 = @VARIABLE 
UNION ... 
SELECT * FROM TableN WHERE columnXN = @VARIABLE 

HINWEIS: UNION wird Zeilen duplizieren. Wenn Sie doppelte Zeilen einfügen möchten, ändern Sie die UNION zu UNION ALL

Verwandte Themen