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