web-dev-qa-db-ja.com

結合する共通フィールドがないSQL Serverの2つのテーブルから選択する正しい方法

昔、私はこのような選択ステートメントを書くために使用していました:

SELECT 
table1.columnA, table2.columnA

FROM
table1, table2

WHERE
table1.columnA = 'Some value'

ただし、「FROM」句にコンマ区切りのテーブル名を使用することはANSI92互換ではないと言われました。 JOINステートメントは常に存在する必要があります。

これは私の問題につながります。..2つのテーブル間でデータを比較したいのですが、結合を作成するための共通のフィールドが両方のテーブルにありません。 FROM句でコンマ区切りのテーブル名の「レガシー」メソッドを使用する場合(コード例を参照)、それは完全に正常に動作します。間違っているか悪い習慣だと思われる場合、この方法を使用するのは不快に感じます。

誰もこの状況で何をすべきか知っていますか?

追加情報:

Table1には「geography」データ型の場所のリストが含まれますTable2には「geography」場所の別のリストが含まれます

ロケーション間の距離を比較するために選択ステートメントを書いています。私が知っている限りでは、地理コラムでJOINを行うことはできませんか?

28
volume one

CROSS JOINを使用できます(使用する必要があります)。次のクエリはあなたのものと同等です:

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

または、いくつかの常に真の条件でINNER JOINを使用することもできます。

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

提案-クロス結合を使用する場合は、重複するシナリオに注意してください。あなたの場合の例:

  • 表1には、主キーの一部として1列以上ある場合があります(table1_id、id2、id3、table2_idなど)
  • 表2には、主キーの一部として1列以上ある場合があります(table2_id、id3、id4など)

これら2つのテーブル間に共通キーがあるため、(つまり、一方/他方の外部キー)-結果が重複します。したがって、次の形式を使用することをお勧めします。

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

クロス結合は、共通のフィールドを持たない複数のテーブルを結合するのに役立ちますが、この結合は2つのテーブルのデカルト結果セットを提供するため、結合中は注意してください。クエリ:

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

常に真である条件で参加する代替方法

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

ただし、パフォーマンスとコーディング標準のために、このタイプのクエリは避ける必要があります。

1
vinay koul