web-dev-qa-db-fra.com

Manière correcte de choisir parmi deux tables dans SQL Server sans champ commun sur lequel se joindre

À l'époque, j’écrivais des énoncés de sélection comme celui-ci:

SELECT 
table1.columnA, table2.columnA

FROM
table1, table2

WHERE
table1.columnA = 'Some value'

Cependant, on m'a dit qu'avoir des noms de table séparés par des virgules dans la clause "FROM" n'était pas compatible ANSI92. Il devrait toujours y avoir une déclaration JOIN. 

Cela conduit à mon problème .... Je veux faire une comparaison de données entre deux tables mais il n'y a pas de champ commun dans les deux tables avec lequel créer une jointure. Si j'utilise la méthode 'legacy' des noms de table séparés par des virgules dans la clause FROM (voir exemple de code), alors cela fonctionne parfaitement. Je suis mal à l'aise avec cette méthode si elle est considérée comme une mauvaise ou une mauvaise pratique.

Quelqu'un sait quoi faire dans cette situation? 

Informaitons supplémentaires:

Le tableau 1 contient une liste d'emplacements dans le type de données "géographie" Le tableau 2 contient une liste différente d'emplacements "géographie".

J'écris une déclaration de sélection pour comparer les distances entre les lieux. Pour autant que je sache, vous ne pouvez pas faire de JOIN sur une colonne de géographie?

27
volume one

Vous pouvez (devriez) utiliser CROSS JOIN. La requête suivante sera équivalente à la vôtre:

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

ou vous pouvez même utiliser INNER JOIN avec des conditions toujours vraies:

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

Une suggestion - lors de l’utilisation de jointures croisées, veuillez vous occuper des scénarios dupliqués. Par exemple dans votre cas:

  • Le tableau 1 peut comporter plus de 1 colonne dans les clés primaires (par exemple, table1_id, Id2, id3, table2_id).
  • La table 2 peut comporter plus de 1 colonne dans les clés primaires (par exemple, table2_id, Id3, id4).

puisqu'il existe des clés communes entre ces deux tables (c'est-à-dire des clés étrangères dans l'une/l'autre) - nous obtiendrons des résultats en double. Par conséquent, utiliser le formulaire suivant est bon:

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 aidera à joindre plusieurs tables sans champs communs. Mais soyez prudent lors de la jointure, car cette jointure donnera un résultat cartésien de deux tables.

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

Une autre façon de s’associer à une condition qui est toujours vraie, comme

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

Mais ce type de requête doit être évité pour des performances et des normes de codage.

1
vinay koul