es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo escribir una consulta SQL para encontrar duplicados en tablas.

Actualmente estoy tratando de escribir una consulta SQL que encuentre cualquier conflicto donde haya filas con los mismos valores de x e y.

Aquí están las tablas con las que estoy trabajando actualmente:

CREATE TABLE Slot (
    sid  INT,
    wall varchar(200),
    x    FLOAT,
    y    FLOAT,
    PRIMARY KEY (sid)
)

CREATE TABLE Route (
    rid     INT,
    name    varchar(200),
    circuit varchar(200),
    PRIMARY KEY (rid)
)

CREATE TABLE Placement (
    rid INT FOREIGN KEY REFERENCES Route(rid),
    hid INT FOREIGN KEY REFERENCES Hold(hid),
    sid INT FOREIGN KEY REFERENCES Slot(sid)
)

Entonces, estoy tratando de encontrar cualquier Slot que esté en la misma pared y tenga valores idénticos de x e y. Además de esto, quiero que todos ellos tengan el mismo circuito de Route.

No sé si debería intentar usar la tercera tabla “Placement”, ya que soy bastante nuevo en esto y me confundí al intentar unirlos porque no tienen columnas compartidas.

Esto es lo que tengo actualmente:

SELECT
    DISTINCT
    S.sid
FROM
    Slot as S,
    Route as R
WHERE
    R.circuit = 'Beginner'
GROUP BY
    S.x,
    S.y,
    S.wall
HAVING
    COUNT(*) > 1

Pero esto arroja un error porque debo usar ‘S.sid’ en un GROUP BY o una función de agregado, pero no quiero agrupar por eso.

Aquí están las funciones INSERT que estaba usando para tratar de usar como ejemplos de lo que tengo hasta ahora.

INSERT INTO Slot (sid, wall, x, y) VALUES (2345, 'south', 4, 7)
INSERT INTO Slot (sid, wall, x, y) VALUES (4534, 'south', 4, 7)
INSERT INTO Slot (sid, wall, x, y) VALUES (2456, 'west', 1, 7)

Entonces aquí devolvería los sid 2345 y 4534 porque ambos están en la pared sur y tienen los mismos valores de x e y.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para encontrar conflictos donde haya filas con los mismos valores de x e y y estén en la misma pared con el mismo circuito de Ruta, es necesario unir las tres tablas y usar una declaración GROUP BY para agrupar por las columnas wall, x, y de la tabla Slot y la columna circuit de la tabla Route, luego utilizar la declaración HAVING para contar el número de filas idénticas que coinciden con las columnas de agrupación. La consulta SQL correcta se puede escribir de la siguiente manera:

    SELECT 
        S.wall, 
        S.x, 
        S.y, 
        R.circuit, 
        COUNT(*) AS CountOfDuplicateSlots 
    FROM 
        Slot AS S
        INNER JOIN Placement AS P ON P.sid = S.sid
        INNER JOIN Route AS R ON R.rid = P.rid
    GROUP BY 
        S.wall, 
        S.x, 
        S.y, 
        R.circuit
    HAVING 
        COUNT(*) > 1
    

    Esta consulta utiliza INNER JOIN para unir las tres tablas en función de sus claves foráneas. Luego agrupa el conjunto de resultados por wall, x, y de la tabla Slot y circuit de la tabla Route. La cláusula HAVING filtra los grupos donde el conteo es uno. El resultado mostrará la pared, x, y y Ruta que comparten los mismos valores y la cuenta de los duplicados.

Comments are closed.