Sintaxis SQL: select solo si hay más de X resultados

Tengo una tabla con medidas llamadas medidas . La tabla tiene una columna para la location y una segunda columna para un valor correspondiente (el ejemplo está simplificado).

La tabla se ve como (nota 2 inputs para loc1 ):

location | value ----------------- loc1 | value1 loc1 | value2 loc2 | value3 loc3 | value4 loc4 | value5 

ahora quiero formular una consulta SQL (en realidad yo uso sqlite) que solo devuelve las primeras dos filas de la tabla (es decir, loc + value1 y loc1 + value2), porque esta location tiene más de una input en esta tabla.

la formulación de pseudotext sería: muéstrame las filas de las ubicaciones, que están presentes más de una vez en toda la tabla
pseudcode:

 SELECT * from measures WHERE COUNT(location over the whole table) > 1 

la solución puede ser realmente simple, pero de alguna manera no parece que rompa la tuerca.

lo que tengo hasta ahora es una statement SELECT, que devuelve ubicaciones que tienen más de una input. como siguiente paso, necesitaría exactamente todas las filas que corresponden a las ubicaciones devueltas de esta consulta:

 SELECT location FROM measures GROUP BY location HAVING count(*) > 1 

así que, como paso siguiente, traté de hacer un JOIN con la misma tabla e incorporar la consulta anterior, pero los resultados son incorrectos. Lo intenté así, pero esto está mal:

 select t1.location, t1.value from measures as t1 join measures as t2 on t1.location = t2.location group by t2.location having count(*) > 1 

ayuda es apreciada!

Tenías razón al usar HAVING , y pensar en usar la autocombinación … simplemente tenía el order de las operaciones ligeramente apagado …

 select m1.location, m1.value from measures m1 join ( select location from measures group by location having count(*) > 1 ) m2 on m2.location = m1.location 

La selección secundaria obtiene todas las ubicaciones que tienen más de una input … y luego esta se une nuevamente a la tabla para get los resultados completos.

SQL Fiddle

Use una selección anidada:

 SELECT location,value,type,value_added FROM measures WHERE location IN (SELECT location FROM measures GROUP BY location HAVING COUNT(*)>1) 

(La syntax es por memory, puede estar algo fuera de lugar)

La idea es get la list de ubicaciones que tienen más de un valor. Los siguientes usos para get los loggings:

 select m.* from measures m where m.location in (select location from measures group by location having count(*) > 1); 

También puede formular esto con una combinación:

 select m.*, mdup.numdups from measures m join (select location, count(*) as numdups from measures group by location having count(*) > 1 ) mdup on m.location = mdup.location; 

Una ventaja de hacer la consulta de esta manera es que puede get el número de duplicates.

 SELECT * FROM measures WHERE (location) IN ( SELECT location FROM measures GROUP BY location HAVING COUNT(location) > 1 ) ORDER BY ASC