Estoy buscando qué ciudades tienen el mismo nombre en diferentes estados. El nombre de la ciudad y el nombre del estado están en tablas separadas (ciudades y estados) y se pueden unir internamente en una columna común separada.
select c1.city, c1.state, c2.city, c2.state
from cities
inner join states on cities.commonid = states.commonid
Después de la unión interna, necesito unirme yo mismo para realizar la siguiente función
select c1.city, c1.state, c2.city, c2.state
from *joined table* c1 join
*joined table* c2
on c1.city = c2.city and c1.state <> c2.state
Me pregunto cómo puedo unirme a una tabla que es el resultado de otra unión en la misma consulta.
la salida será así
+----------+-------+--------+--------+
| city1 | state1|city2 |state2 |
+----------+-------+--------+--------+
| x | melb | x | syd |
| y | bris | y | ACT |
+----------+-------+--------+--------+
1
Su consulta parece correcta. ¿Cuál es el problema? ¿Puede agregar datos de muestra?¿ch explica lo que quieres aquí?
- Tim Biegeleisen
28 de marzo de 2021 a las 8:19
2
Proporcione datos de muestra y resultados para demostrar su problema Cómo crear un ejemplo mínimo y reproducible
- Stu
28 de marzo de 2021 a las 8:26
------------------------------------
Supongo que la tabla ciudades tiene una columna como state_id que hace referencia a una columna state_id en los estados de la tabla (cambie los nombres al actonombres comunes de las columnas).
Primero haz una autounión para las ciudades con las condiciones:
c1.city = c2.city AND c1.state_id < c2.state_id
El < El operador se asegura de que cada par de ciudades se devuelva solo una vez.
Luego une 2 copias de estados, porque cada una de ellas se usará para obtener el nombre del estado para cada una de las 2 ciudades:
SELECT c1.city city1, s1.state state1,
c2.city city2, s2.state state2
FROM cities c1
INNER JOIN cities c2 ON c1.city = c2.city AND c1.state_id < c2.state_id
INNER JOIN states s1 ON s1.state_id = c1.state_id
INNER JOIN states s2 ON s2.state_id = c2.state_id
ORDER BY city1
1
sí; el < El operador acaba de resolver mi problema ~ gracias
- Shitathakin
28/03/2021 a las 11:27
------------------------------------
Puedes seleccionar tu consulta de unión interna y asignarle un alias.
Entonces se convertirá en algo como lo siguiente...
Select c.city,c.state from
(Select City,state from cities inner join states where cities.id = states.id) as c
Ahora haz una autounión para c.
3
¿Por qué no incluir la solución completa (una vez actualizada la combinación)?
-Peter Smith
28 de marzo de 2021 a las 8:46
Intentar autounirse a c en esta situación devuelve una relación de error "c" no existe LÍNEA 5: unir c c2 en c.city = c2.city y c.state <> c2.estado
- Shitathakin
28/03/2021 a las 9:00
Necesita ver la consulta completa; los datos de muestra (no solo los resultados) también serían buenos.
-Peter Smith
28/03/2021 a las 10:27
------------------------------------
Realizaría una consulta previa de todas las ciudades que tengan más de un estado. Luego únete a la tabla de estados para ver qué estados se encuentran.
select
Duplicates.city,
s.state
from
( select c1.city
from cities c1
group by c1.city
having count(*) > 1 ) Duplicates
JOIN cities c2
on Duplicates.city = c2.city
JOIN states s
on c2.commonid = s.commonid
order by
Duplicates.city,
s.state
Si NO intenta hacer una tabla cruzada de solo dos ciudades/estados, obtendrá una lista única. Si existe el nombre de una ciudad en 5 estados, ¿cómo planearías mostrarlo? De esta manera verías todo ordenado alfabéticamente.
------------------------------------
Sugeriría un CTE:
with cs as (
select c.name as city_name, s.name as state_name
from cities c join
states s
on c.commonid = s.commonid
)
select cs1.*, cs2.*
from cs cs1 join
cs cs2
on cs1.name = cs2.name and cs1.state <> cs2.state;