sentencias - separar cadena delimitada por comas en sql server
Necesita ayuda con la consulta sql para encontrar elementos etiquetados con todas las etiquetas especificadas (2)
Usando IN:
SELECT p.*
FROM POSTS p
WHERE p.id IN (SELECT tg.post_id
FROM TAGGINGS tg
JOIN TAGS t ON t.id = tg.tag_id
WHERE t.name IN (''Cheese'',''Wine'',''Paris'',''Frace'',''City'',''Scenic'',''Art'')
GROUP BY tg.post_id
HAVING COUNT(DISTINCT t.name) = 7)
Usando un JOIN
SELECT p.*
FROM POSTS p
JOIN (SELECT tg.post_id
FROM TAGGINGS tg
JOIN TAGS t ON t.id = tg.tag_id
WHERE t.name IN (''Cheese'',''Wine'',''Paris'',''Frace'',''City'',''Scenic'',''Art'')
GROUP BY tg.post_id
HAVING COUNT(DISTINCT t.name) = 7) x ON x.post_id = p.id
Usando EXISTS
SELECT p.*
FROM POSTS p
WHERE EXISTS (SELECT NULL
FROM TAGGINGS tg
JOIN TAGS t ON t.id = tg.tag_id
WHERE t.name IN (''Cheese'',''Wine'',''Paris'',''Frace'',''City'',''Scenic'',''Art'')
AND tg.post_id = p.id
GROUP BY tg.post_id
HAVING COUNT(DISTINCT t.name) = 7)
Explicación
El quid de la COUNT(DISTINCT t.name)
es que el COUNT(DISTINCT t.name)
necesita coincidir con el número de nombres de las etiquetas para garantizar que todas esas etiquetas estén relacionadas con la publicación. Sin el DISTINCT, existe el riesgo de que los duplicados de uno de los nombres devuelvan un recuento de 7, por lo que tendría un falso positivo.
Actuación
La mayoría le dirá que el JOIN es óptimo, pero JOIN también corre el riesgo de duplicar filas en el conjunto de resultados. EXISTS sería mi próxima opción: no hay riesgo duplicado y, en general, una ejecución más rápida, pero consultar el plan de explicación en última instancia te dirá qué es lo mejor según tu configuración y tus datos.
Digamos que tengo las siguientes tablas:
TAGS
id: entero
nombre: cadena
POSTS
id: entero
cuerpo de texto
ETIQUETAS
id: entero
tag_id: entero
post_id: entero
¿Cómo voy a escribir una consulta que seleccione todas las publicaciones etiquetadas con TODAS las siguientes etiquetas (nombre del atributo de la tabla de etiquetas): "Queso", "Vino", "París", "Fracción", "Ciudad", " Escénico "," Arte "
Consulte también: necesita ayuda con la consulta sql para encontrar elementos con la mayoría de las etiquetas especificadas (nota: ¡similar, pero no duplicada!)
Prueba esto:
Select * From Posts p
Where Not Exists
(Select * From tags t
Where name in
(''Cheese'', ''Wine'', ''Paris'',
''Frace'', ''City'', ''Scenic'', ''Art'')
And Not Exists
(Select * From taggings
Where tag_id = t.Tag_Id
And post_Id = p.Post_Id))
Explicación : Pedir una lista de las Publicaciones que han tenido asociado un conjunto de etiquetas específico es equivalente a solicitar aquellas publicaciones en las que no hay ninguna etiqueta en el mismo conjunto especificado, que no se haya asociado con ella. es decir, el sql anterior.