Ver Mensaje Individual
  #2 (permalink)  
Antiguo 12/11/2012, 08:44
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: me repite los registros

Hola sosajuancarlosh:

Veo que este es tu primer mensaje, así es que antes que nada, bienvenido al foro, espero que sigas participando activamente en el foro, y si puedes hacer alguna contribución, pues adelante!.

ahora si, pasemos a tu problema... por lo que pude observar casi lograbas la consulta, creo que era solo cuestión de que continuaras investigando un poco... Las condiciones de filtrado pueden ser tan sencillas o tan complejas como necesites, para lo que tú quieres hacer de hecho hay muchas formas en que puedas conseguirla (con NOT IN, NOT EXISTS, o LEFT JOIN)... para el ejemplo voy a utilizar NOT EXISTS.

En la consulta que pones en tu post utilizas de manera correcta el operador OR, ya que en realidad son dos condiciones las que te interesan:

Código:
posicion = 1 or (posicion > 1 AND manual = .t.)  
Sin embargo, la primer parte de la condición, marcada con azul está incompleta, dado que debes excluir aquellos registros que cumplen con la segunda condición. Como te dije, hay varias formas de hacer esto, una sería así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM oferta;
  2. +------------+-----------+--------+----------+----------+-------------+
  3. | idproducto | proveedor | precio | cantidad | posicion | selecmanual |
  4. +------------+-----------+--------+----------+----------+-------------+
  5. |       1000 | prove1    |    0.5 |       12 |        1 | .f.         |
  6. |       1000 | prove2    |   0.53 |       12 |        2 | .f.         |
  7. |       1000 | prove3    |      1 |       12 |        3 | .f.         |
  8. |       1001 | prove1    |    1.2 |       11 |        1 | .f.         |
  9. |       1001 | prove2    |    1.5 |       11 |        2 | .t.         |
  10. +------------+-----------+--------+----------+----------+-------------+
  11. 5 rows in set (0.00 sec)
  12.  
  13. mysql> SELECT * FROM oferta o1
  14.     -> WHERE
  15.     -> (o1.posicion = 1 AND NOT EXISTS ( SELECT o2.idproducto
  16.     ->                                   FROM oferta o2
  17.     ->                                   WHERE o2.idproducto = o1.idproducto
  18.     ->                                   AND o2.selecmanual = '.t.')
  19.     -> ) OR
  20.     -> (o1.posicion > 1 AND o1.selecmanual = '.t.');
  21. +------------+-----------+--------+----------+----------+-------------+
  22. | idproducto | proveedor | precio | cantidad | posicion | selecmanual |
  23. +------------+-----------+--------+----------+----------+-------------+
  24. |       1000 | prove1    |    0.5 |       12 |        1 | .f.         |
  25. |       1001 | prove2    |    1.5 |       11 |        2 | .t.         |
  26. +------------+-----------+--------+----------+----------+-------------+
  27. 2 rows in set (0.00 sec)

Observa que lo único que estoy haciendo es agregar una condición con NOT EXISTS para excluir los registros duplicados.

Código:
SELECT * FROM oferta o1 
WHERE 
(o1.posicion = 1 AND NOT EXISTS ( SELECT o2.idproducto 
                                  FROM oferta o2 
                                  WHERE o2.idproducto = o1.idproducto 
                                  AND o2.selecmanual = '.t.')
) OR 
(o1.posicion > 1 AND o1.selecmanual = '.t.');
Trata de analizar la consulta, y si tienes algún problema para entenderla, coméntalo en el foro. Y finalmente, como recomendación PRACTICA, PRACTICA Y PRACTICA... es la mejor manera para adquirir conocimientos en SQL.

Saludos
Leo.