2013-07-10 6 views
26

Back katılmak için herhangi bir ortak alanı ile SQL Server iki tablo seçmek için, böyle seçkin ifadeleri yazmak için kullanılan: Ben virgülle ayrılmış olan söylendi AncakDoğru yolu eski günlerde

SELECT 
table1.columnA, table2.columnA 

FROM 
table1, table2 

WHERE 
table1.columnA = 'Some value' 

"FROM" deyimindeki tablo adları ANSI92 ile uyumlu değil. Her zaman bir JOIN ifadesi olmalıdır.

Bu, sorunuma neden olur .... İki tablo arasında veri karşılaştırması yapmak istiyorum, ancak her iki tabloda da bir birleştirmenin oluşturulacağı ortak bir alan yok. FROM deyiminde virgülle ayrılmış tablo adlarının 'eski' yöntemini kullanırsam (bkz. Kod örneği), o zaman mükemmel çalışır. Yanlış veya kötü uygulama olarak kabul edilirse, bu yöntemi kullanmaktan rahatsız oluyorum.

Bu durumda ne yapılması gerektiğini bilen var mı?

Ekstra Bilgi: Tablo1 'coğrafya' veri türü Tablo2 konumların bir listesini içerir

ben arasındaki mesafeleri karşılaştırmak için seçme deyimi yazıyorum

'coğrafya' konumlarının farklı bir listesini içerir

yerler. Bildiğim kadarıyla bir coğrafya sütununda JOIN yapamazsınız?

+0

Ortak alan yoksa nasıl karşılaştırırsınız? – maSTAShuFu

+1

'Table1, Table2', Table1 CROSS JOIN Table2' ile işlevsel olarak özdeştir, *** gerçekten *** ne elde etmeye çalışıyorsunuz? Bir tabloda birden fazla satır varsa, her iki tablonun satırları çoğaltılacak ... Muhtemelen bazı örnek giriş verileri ve karşılık gelen örnek çıktı verilerini vermelisiniz. – MatBailie

+0

Evet MatBaile, Cross Join kullanmam gerekiyor. Yardımın için teşekkürler –

cevap

48

CROSS JOIN ürününü (kullanmalısınız) kullanabilirsiniz. Aşağıdaki sorgu sizinkine eşdeğer olacaktır:

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

veya hatta İÇ bazı her zaman doğru conditon ile JOIN kullanabilirsiniz:

FROM table1 
INNER JOIN table2 ON 1=1 
1

bir öneri - yinelenen senaryoların dikkat edin katılmak haçı kullanırken. Örneğin sizin durumunuzda:

1) tablo 1, birincil anahtarların bir parçası olarak> 1 sütun içerebilir (örneğin, table1_id, id2, id3, table2_id) 2) tablo 2, birincil anahtarların bir parçası olarak> 1 sütun içerebilir. tablo2_id, id3, id4)

Bu iki tablo arasında ortak anahtarlar bulunduğundan (yani, bir/diğer yabancı anahtarlar) - sonuç olarak iki sonucu olacaktır. dolayısıyla aşağıdaki formu kullanarak iyidir:

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

Çapraz bu kadar katılma işlemi dikkatli ortak fields.But ile çoklu tablo katılmak için yardımcı olacaktır katılmak iki tablo kartezyen resultset verecektir katılmak. SORGU:

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

Alternatif bir yol

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

gibi her zaman doğrudur Ama bu tür sorgu performansı hem de kodlama standartları için kaçınılması gereken bazı şartla katılmak.