Laden...

SQL-Frage

Erstellt von schnecke vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.217 Views
S
schnecke Themenstarter:in
223 Beiträge seit 2005
vor 18 Jahren
SQL-Frage

Hi,

habe mal eine kleine Frage zu einem SQL-Statement.... bzw. ob es so ein Statement gibt. Ich habe 20 Tabellen, die alle die Spalte "Name" haben. Nun möchte ich gucken, in welchen Tabellen in dieser Spalte ein String (z.B. "hallo") steht. Da ich nun aber schreibfaul bin, habe ich keine Lust, 20x die gleiche Abfrage zu stellen. Gibt es vll. sowas wie:

SELECT Name FROM ALLE_TABELLEN_IN_DB WHERE Name like 'hallo';

... denn eine Select geht meines Wissens nach nur auf Tabellen, nicht aber auf DBs oder so...

Andere Möglichkeit wäre, alle Tabellennamen in ein Array zu schreiben und in ner Schleife durch das Array zu walken und jedesmal ne Abfrage zu schicken mit dem richtigen Tabellennamen... so würde ich es jetzt wohl auch machen, aber vll. hat noch jemand eine andere tolle Idee. 🙂

Grüße!

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo schnecke,

ich denke bei den meisten DBs kann man ein Select über die Systemtabellen machen, um die Namen der Tabellen zu ermitteln, die eine Spalte NAME haben.

Aber mit den Tabellennamen kann man dann m.E. auch nur die Array-Variante sinnvoll verwenden.

herbivore

_
416 Beiträge seit 2005
vor 18 Jahren

Hallo,

ich wird auch die Arrayvariante nehmen. Aber die Anweisung dann dynamisch zusammen bauen. Also:

SELECT Name FROM Tabelle1 Name like 'hallo'
UNION ALL
...
UNION ALL
SELECT Name FROM TabelleN Name like 'hallo'

so dass du nur eine Anfrage senden musst. Die Datenbank an sich braucht natürlich genau so lang wie wenn dus einzeln abfragst.

Aber dir is schon klar dass du so nur: Name

Hallo
Hallo
Hallo
...

rausbekommst, oder 😉

cu, tb

4.221 Beiträge seit 2005
vor 18 Jahren

Original von tb

SELECT Name FROM Tabelle1 Name like 'hallo'
UNION ALL
...
UNION ALL
SELECT Name FROM TabelleN Name like 'hallo'

Tipp: noch den Tabellennamen in den Output bringen 😉

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

3.728 Beiträge seit 2005
vor 18 Jahren
Volltext-Kataloge

Wenn es sich bei der DB um einen SQL Server (einen echten, nicht die MSDE) handelt, kannst Du die Volltextsuche verwenden, um Tabellen- und Datenbankübergreifend zu suchen. Die Volltextsuche wird in sogenannten Katalogen konfiguriert. In so einem Katalog wird festgelegt, über welche Felder in welchen Tabellen gesucht werden kann. Konfigurierte Volltext-Kataloge können über spezielle T-SQL-Sprachkonstrukte in Deinem SELECT-Statement eingebaut werden. Näheres dazu steht in der SQL-Server Online Hilfe (Query Analzyer öffnen und F1 drücken) oder in der MSDN Library.

S
schnecke Themenstarter:in
223 Beiträge seit 2005
vor 18 Jahren

@Rainbird: Habe "nur" einen MySQL-Server zur Verfügung....
Habe es jetzt aber so, wie tb und Programmierhans geschrieben haben und es geht auch von der Geschwindigkeit her 🙂

... nun die nächste SQL-Frage (sorry, wenn ich frage, aber vll. hat ja doch jemand eine Idee...):

Ich mache viele INSERTs in eine MySQL-DB und möchte VOR jedem Insert prüfen, ob der Datensatz schon vorhanden ist. Meine Tabelle sieht so aus:

ID      Name       Vorname     

Wenn ich nun schon den Datensatz "Müller Hans" habe, soll dieser nicht noch mal eingefügt werden. Die ID ist nicht wichtig, es geht um alle anderen Daten ausser der ID. Wie kriege ich so ein Statement hin? Und das auch noch in einer guten Performance (denn es müsste in 5000 Datensätzen geprüft werden).?!

EDIT
Ich habe gerade eine Idee... weiß aba nicht, ob die "gut" ist: Ich könnte ja ein SELECT machen ala:

SELECT Name,Vorname FROM tabelle WHERE Name LIKE 'Müller' AND Vorname LIKE 'Hans';

und wenn ich NULL zurück bekomme, dann weiß ich, dass es den Datensatz noch nicht gibt, wenn was anderes als NULL kommt, dann gibt es ihn schon. Ist das klug oder doch noch rechenaufwendig?!

_
416 Beiträge seit 2005
vor 18 Jahren

Hallo,

erstens, like verwendet man nur wenn man auch platzhalter verwendet. Bei dir also lieber mit "=" arbeiten.

zweitens, ich kenn MySQL leider nicht direkt. Aber es ist immer besser die Integritätsbedingungen (in deinem Fall dass keine Person zwei mal in der DB stehen sollen) in die DB zu legen, schließlich könnte es ja mal passieren dass irgendwann mal noch ein anderes Programm die DB benutzt und dann deine DB versaut. D.h. falls es in MySQL möglich ist Trigger zu benutzen, dann löse es lieber da drüber. Das ist obendrein noch schneller, da dein Client nur eine Anfrage schicken muss.

cu, tb