it-swarm.com.de

Richtige Möglichkeit zur Auswahl aus zwei Tabellen in SQL Server ohne gemeinsames Feld zum Verbinden

Früher schrieb ich solche Aussagen wie folgt:

SELECT 
table1.columnA, table2.columnA

FROM
table1, table2

WHERE
table1.columnA = 'Some value'

Mir wurde jedoch gesagt, dass das Trennen von durch Kommas getrennten Tabellennamen in der "FROM" -Klausel nicht ANSI92-kompatibel ist. Es sollte immer eine JOIN-Anweisung geben. 

Dies führt zu meinem Problem .... Ich möchte einen Datenvergleich zwischen zwei Tabellen durchführen, aber es gibt kein gemeinsames Feld in beiden Tabellen, mit dem ein Join erstellt werden kann. Wenn ich in der FROM-Klausel die "Legacy" -Methode mit durch Kommas getrennten Tabellennamen verwende (siehe Codebeispiel), funktioniert das einwandfrei. Ich fühle mich mit dieser Methode unwohl, wenn sie als falsche oder schlechte Praxis betrachtet wird.

Weiß jemand, was in dieser Situation zu tun ist? 

Zusatzinformation:

Tabelle1 enthält eine Liste von Positionen im Datentyp 'Geografie' Tabelle2 enthält eine andere Liste von 'Geografie'-Positionen

Ich schreibe eine select-Anweisung, um die Entfernungen zwischen den Standorten zu vergleichen. Soweit ich weiß, können Sie keine JOIN auf einer Geographiesäule machen?

27
volume one

Sie können CROSS JOIN verwenden. Die folgende Abfrage entspricht Ihrer:

SELECT 
   table1.columnA
 , table2.columnA
FROM table1 
CROSS JOIN table2
WHERE table1.columnA = 'Some value'

oder Sie können INNER JOIN mit einigen immer zutreffenden Bedingungen verwenden:

FROM table1 
INNER JOIN table2 ON 1=1
49
Nenad Zivkovic

Ein Vorschlag - Wenn Sie Cross Join verwenden, beachten Sie bitte die doppelten Szenarien. Zum Beispiel in Ihrem Fall:

  • Tabelle 1 kann> 1 Spalten als Teil von Primärschlüsseln enthalten (z. B. table1_id, Id2, id3, table2_id).
  • Tabelle 2 kann> 1 Spalten als Teil von Primärschlüsseln enthalten (z. B. table2_id, Id3, id4).

da es gemeinsame Schlüssel zwischen diesen beiden Tabellen gibt, (d. h. Fremdschlüssel in einer/anderen) -, werden am Ende doppelte Ergebnisse erzielt. Daher ist die Verwendung der folgenden Form gut:

WITH data_mined_table (col1, col2, col3, etc....) AS
SELECT DISTINCT col1, col2, col3, blabla
FROM table_1 (NOLOCK), table_2(NOLOCK))
SELECT * from data_mined WHERE data_mined_table.col1 = :my_param_value
1
ha9u63ar

Cross Join hilft dabei, mehrere Tabellen ohne gemeinsame Felder zu verbinden. Seien Sie jedoch vorsichtig, da dieser Join das kartesische Ergebnisset aus zwei Tabellen ergibt.

SELECT 
   table1.columnA
 , table2,columnA
FROM table1 
CROSS JOIN table2

Alternative Möglichkeit, sich an einer Bedingung zu beteiligen, die immer wahr ist

SELECT 
   table1.columnA
 , table2,columnA
FROM table1 
INNER JOIN table2 ON 1=1

Diese Art von Abfrage sollte jedoch für die Leistung sowie für Codierungsstandards vermieden werden.

1
vinay koul