sql: unión automática después de una unión interna

CorePress2024-01-25  10

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;

randomThread
Python - Crear una ventana de desenfoque transparenteformularios: el botón al hacer clic no funciona en reaccionarJS con el siguiente códigossl: Kubernetes no puede extraer la imagen del registro privado de Dockerjavascript - Reposicionar la barra de herramientas del editor de texto quillsublimetext3 - Eliminando hasta espacios en blanco en Sublime Textc - ¿Existe una versión de fgets que no termina en una nueva línea sino que lee un archivo con un número específico de caracterePython 3.x: cómo leer hojas de cálculo privadas de Google utilizando la API de hojas de cálculo de Google sin una cuenta de servswift - Enlace personalizado de estado dentro de ForEachjavascript - ¿Cómo llamar a un php con parámetro de un