varias unir tablas tabla relacionadas multitablas misma inner horizontalmente ejemplos consultas consultar consulta sql sql-server sql-server-2012

relacionadas - Manera correcta de seleccionar de dos tablas en SQL Server sin un campo común para unirse



unir dos consultas sql misma tabla (3)

La combinación cruzada ayudará a unir varias tablas sin campos comunes. Pero tenga cuidado al unirse ya que esta combinación le dará un conjunto de resultados cartesiano de dos tablas. CONSULTA:

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

Una forma alternativa de unirse en alguna condición que siempre es cierta como

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

Pero este tipo de consulta debe evitarse tanto para el rendimiento como para los estándares de codificación.

En los viejos tiempos, solía escribir declaraciones selectas como esta:

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

Sin embargo, me dijeron que tener nombres de tablas separados por comas en la cláusula "FROM" no es compatible con ANSI92. Siempre debe haber una declaración ÚNETE.

Esto conduce a mi problema ... Quiero hacer una comparación de datos entre dos tablas, pero no hay un campo común en ambas tablas con el que crear una unión. Si utilizo el método ''heredado'' de nombres de tablas separados por comas en la cláusula FROM (ver ejemplo de código), entonces funciona perfectamente bien. Me siento incómodo con este método si se considera una práctica incorrecta o incorrecta.

¿Alguien sabe qué hacer en esta situación?

Información extra:

Tabla1 contiene una lista de ubicaciones en el tipo de datos ''geografía'' Tabla2 contiene una lista diferente de ubicaciones ''geográficas''

Estoy escribiendo una declaración de selección para comparar las distancias entre las ubicaciones. Por lo que sé, ¿no puedes hacer una ÚNETE en una columna de geografía?


Puedes (deberías) usar CROSS JOIN . La siguiente consulta será equivalente a la tuya:

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

o incluso puedes usar INNER JOIN con alguna condición siempre verdadera:

FROM table1 INNER JOIN table2 ON 1=1


Una sugerencia: al utilizar la combinación cruzada, tenga en cuenta los escenarios duplicados. Por ejemplo en tu caso:

  • La tabla 1 puede tener> 1 columnas como parte de las claves primarias (por ejemplo, table1_id, id2, id3, table2_id)
  • La tabla 2 puede tener> 1 columnas como parte de las claves primarias (por ejemplo, table2_id, id3, id4)

Ya que hay claves comunes entre estas dos tablas (es decir, claves externas en una / otra) , terminaremos con resultados duplicados. Por eso es bueno usar la siguiente forma:

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