2012-03-30 18 views
3

duplizieren ich mit mehreren hundert Spalten zwei Tabellen anschließen möchten, wie folgt aus:SQL - beitreten, ohne den Schlüssel

select * from a, b where a.key = b.key 

Das Problem ist, dass ich einen Tisch zu bekommen, die

Key | Key | Row1 | etc... 

Ohne hat Namensgebung alle Spalten explizit ("select a.key, row1, ... from a, b where a.key = b.key"), gibt es eine Möglichkeit, die Abfrage so zu beschränken, dass sie nur einen der Schlüssel zurückgibt?

+4

nein können Sie nicht, müssen Sie Spalten angeben, die Sie wollen, wenn Sie nur Daten von 'b 'möchten, dann können Sie' a.key, b. * ' –

+0

@rs tun. Ah, das kümmert sich darum. Es scheint, als ob die Antwort von Hiro2k deinem ersten Satz widerspricht; Ihre Lösung scheint jedoch die beste für meine Zwecke zu sein. Vielen Dank! – canisrufus

Antwort

6
select * from a INNER JOIN b USING (key) 

Die USING-Anweisung bewirkt, dass der Schlüssel nur einmal in Ihrem Ergebnis angezeigt.

+0

Danke, das scheint das Problem zu lösen, als ich es fragte. Ich habe das zusätzliche Problem, wo meine Schlüssel nicht übereinstimmen: Ich muss den Teilstring von einem der Schlüssel nehmen. Gibt es eine Syntax, die substring (key1) = key2 zulässt? – canisrufus

+0

Das ist ein Zeichen für schlechtes Design. Die Schlüssel in Ihren Tabellen sollten zu 100% übereinstimmen. Wenn du das machen wolltest, könntest du das aber nicht mit der USING-Klausel. Sie müssten zur Verwendung der ON-Klausel wechseln, aber dann werden die Duplikate wieder angezeigt. – Hiro2k

+1

@ Hiro2k Das ist eine Frage von sehr starken Auseinandersetzungen in DB-Kreisen. Persönlich denke ich, dass "VERWENDEN" als Join-Bedingung ein schreckliches Fehlverhalten ist, das zu zerbrechlichem SQL führt. Der eigentliche Fix ist nicht die Verwendung von 'SELECT * 'im Produktionscode - listet die Spalten explizit auf, immer und ohne Fehler. Das schützt Sie davor, dass Spalten hinzugefügt/umgeordnet werden und hilft dem Parser in den meisten DBs, auch nützlichere Fehlermeldungen zu geben. –

3

Vielleicht NATURAL JOIN ist Lösung für Sie:

SELECT * FROM a NATURAL JOIN b; 

Aber wenn es mehr duplizierten Schlüsselnamen sind und Sie beide solcher Schlüssel in den Ergebnissen, dann kommen natürlich nicht gut für Sie ist.

+3

+1 für mich etwas neues zu lehren. Laut wikipedia: "Die meisten Experten sind sich einig, dass NATURAL JOINs gefährlich sind und raten daher dringend davon ab, sie zu benutzen." Wahrscheinlich werde ich mit der "Using" -Anweisung gehen. – canisrufus

+0

Am Anfang habe ich die Frage missverstanden. Ich dachte, dass Sie alle doppelten Schlüsselnamen entfernen möchten. Und ich stimme zu, natürliche Join ist gefährlich und sollte nicht verwendet werden. –

1

Wenn Sie Ihre Felder speziell anstelle von * benennen, haben Sie keine doppelten Schlüssel und die Abfrage wird schneller (so habe ich gehört).

select key, field1, field2, field3 from a, b where a.key = b.key 
+0

Die Tatsache, dass es mehrere hundert Spalten ist macht diese Art von unansehnlich .. – canisrufus

+0

Es sollte nicht die Abfrage schneller auf jedem vernünftigen DB ich bin bewusst, es sei denn, Sie wollen eigentlich nur eine kleine Teilmenge der Spalten. Selbst dann wird es nur helfen, wenn die ausgelassenen Spalten wirklich groß sind (zB: Kosten für die Übertragung der Daten auf den Client reduzieren) oder außerhalb des Haupttupels mit einem Mechanismus wie PostgreSQL 'TOAST' gespeichert werden Der Abruf der großen Spalte (n) kann komplett übersprungen werden. –

+2

@canisrufus "Mehrere hundert Spalten" könnten zu deinem Problem gehören ;-), aber ich verstehe, dass saubere und schöne Designs nicht immer den tatsächlichen Leistungsanforderungen entsprechen. Abhängig von der Situation sollten Sie einen Schlüssel/Wert-Erweiterungstyp wie PostgreSQLs 'hstore' oder sogar * shudder * EAV-Design in Betracht ziehen. Mit 'SELECT *' neigst du dazu, dich selbst zu hassen, wenn du zum ersten Mal eine Spalte hinzufügen oder - schlimmer noch - eine irgendwo in der Mitte einfügen musst. –