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.
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 columnaswall
,x
,y
de la tablaSlot
y la columnacircuit
de la tablaRoute
, luego utilizar la declaraciónHAVING
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:Esta consulta utiliza
INNER JOIN
para unir las tres tablas en función de sus claves foráneas. Luego agrupa el conjunto de resultados porwall
,x
,y
de la tablaSlot
ycircuit
de la tablaRoute
. La cláusulaHAVING
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.