!!! Sorpresa !!! LAST no es un comando SQL

05/12/2004 - 05:10 por Mc_Clan | Informe spam
Hola a Todos,

Estudio una soluccion para obtener una lista con PHP desde un DataBase
MSSQL, parece facil ScansID, IP, OS ... donde el campo IP se
repite, como hacer para obtener los ultimos IP in relaccion al campo de
ScansID ?? mientras yo seguia obteniendo dobles de IP mi colega haciendo
una Query con Microsoft Acces lo logra sin dobles. Cojo la query "de
acces" que nos dà un resultado tan bonito y que es la siguiente:-

SELECT MAX(Scan.ScansID) as MAXSCANSID, Scan.IP, LAST(Scan.OS) as LASTOS
FROM Scan
GROUP BY Scan.IP
HAVING (((LAST(SCAN.OS)) IS NULL))
ORDER BY Scan.IP

!!! Sorpresa !!! LAST no es un comando SQL (Comprobado tambien en Shell)

No sè que cxxxxx hace el acces con esta sintax pero la hace funcionar..

Alguna idea???? (mismo sugerencia de como formular esta query desde PHP)

Muchas Gracias a Todos

McClan
NOTA

HE intentado tambien
SELECT DISTINCT IP // pero como le meto otro campo al lado se pasa el
DISTINCT para el forro.

Preguntas similare

Leer las respuestas

#6 Mc_Clan
05/12/2004 - 20:29 | Informe spam
Me vas a perdonar, pero no comprendo para nada del codigo.

Lo he leido x veces y tengo los tipos del psiquiatrico que se me quieren
llevar de paseo.

Lo se que soy torpe, pero please, como los hecho hasta ahora, te pido
me lo explicas o tienes una pregunta de reserva?

gracias ;-)

un abrazo

Maxi a écrit :
Hola, pues bueno aca podemos usar una ventaja que dan los autonumericos
cuando se los usa de forma correcta.

Veamos este ejemplo.

SELECT T1.ID, T2.IP FROM (SELECT MAX(CAMPO_AUTONUMERICO) AS
ID, IP FROM TABLA GROUP BY IP) T1 INNER JOIN
(SELECT CAMPOAUTONUMERICO,IP FROM TABLA) T2 ON
T1.CAMPOAUTONUMERICO = T2.ID


pd: adaptablo bien a tu tabla por favor.

Un abrazo


"Mc_Clan" escribió en el mensaje
news:41b33aa6$0$9052$
Efectivamente, el uso correcto deberia ser el TOP + pero tengo ni
idea de como usar el TOP

La Base funciona asì:-
Todos los dias arranca un programa que escanea la classe B de la red,
escribe los datos en la base MSSQL, utilizando el campo ScansID como
campo numerico (Autoincrementacion) de identificacion del escaneo en curso.
Por lo tanto el primer escan ha sido el 1 ahora estarà por el 40, a
veces los ordenadores escaneado estan apagado o se ha echo alguna
intervencion para meterlo en conformità de un referencial.
Bueno, si busco por ejemplo el ordenador 192.X.X.1 lo encontrarè tantas
veces cuantas veces ha sido encontrado para el motor de escan y por lo
tanto enumerado en ScansID ej.

ScansID IP
=> 1 192.X.X.1
4 192.X.X.1
9 192.X.X.1

Encontrado 3 Veces, donde la ultima vez es el ScansID 9

Haciendo un SELECT DISTINCT IP FROM Scan me dà como resultado 1 (ScansID
= 9) que es correcto, pero si añado otros campos al SELECT para sacar
una lista (que cante mas sobre estos IP) o meter unas condiciones (WHERE
OS IS NULL) pierdo este privilegio de SELECT DISTINCT e vuelve a
contarme todas las veces que la IP ha Aparecido.

Gracias
=> McClan


PS

estaba incorrecto, sorry

Maxi a écrit :

Hola, si el max no te es util has pensado en el TOP 1? el tema es qwue
debes definirme cual es el primer registro? con que criterio lo haces?

por ej: el que tiene la menor fecha?

Este concepto del last es un concepto de cursores y sqlserver como muchos
otros motores de BDD no estan diseñados ni optimizados para trabajar asi,
sino que trabajan con conjuntos de datos :)


"Mc_Clan" escribió en el mensaje
news:41b324ca$0$8117$


Ante de todo Muchissimas gracias por tu Ayuda,
La verdad es que me estoy volviendo loco.

Acabo de aprender porquè el LAST no funciona, por pura curiosidad lo digo,
aunque estoy seguro que ya lo sabes. LAST y FIRST Hacen parte del dialecto
JET-SQL y no de Transact-SQL, ademas no se aconseja el uso de estos etc.
etc. bueno, resultado, que el Access lo usa sin que se le pida nada y
desde PHP no logro hacer la query con el mismo resultado.

El Max no me funciona, te explico un poco aunque es realmente muy basico
por lo que probablemente por mi torpeza o desconocimiento me voy a dormir
hasta el año nuevo para la verguenza ;-)


Detalle:

Si hago:
SELECT DISTINCT IP FROM SCAN
// el resultado es 2608 = Correcto gracias a SELECT

Como intento añadir otros campos, vaya fiesta, ej.;
SELECT DISTINCT IP, OS FROM SCAN
// el resultado es 3400 = donde el campo IP se repite X veces :-(

//Ni hablar de meter condiciones a la query ej.;
SELECT DISTINCT IP FROM SCAN WHERE OS IS NULL
// BOOM 2457 = el resultado real es 334 :-(

Resumiendo, la estructura del DB es:
ScansID, IP, OS etc. etc.

Resultado buscado

1. Contar quantas maquinas han pasado por un scan (IP no repetidas)
//Con el DISTINCT todo OK, meno que no puedo listar nada, porquè
//como añado campos me cambia el resultado con los doblones "de oro"
;-)

2. Obtener el listado de las maquinas que han pasado por un scan
3. Obtener el listado con los campos OS Like '%WIN%'
4. Obtener el listado con los campos OS NOT Like '%WIN%'
5. Obtener el listado con los campos OS NULL


Otra vez Gracias por tu tiempo.

==>>>McClan



Maxi a écrit :


Hola, podrias usar la funcion MAX ya que SqlServer no numera bajo ningun
concepto los registros. Otra solucion es que definas un orden y armes un
aquery para numerar de menor a mayor por ej.

Fijate si con el MAX te es util, de lo contrario me avisas y te paso un
ej de como hacerlo de otra forma.

Abrazos


"Mc_Clan" escribió en el mensaje
news:41b28a4d$0$8115$



Hola a Todos,

Estudio una soluccion para obtener una lista con PHP desde un DataBase
MSSQL, parece facil ScansID, IP, OS ... donde el campo IP se
repite, como hacer para obtener los ultimos IP in relaccion al campo de
ScansID ?? mientras yo seguia obteniendo dobles de IP mi colega haciendo
una Query con Microsoft Acces lo logra sin dobles. Cojo la query "de
acces" que nos dà un resultado tan bonito y que es la siguiente:-

SELECT MAX(Scan.ScansID) as MAXSCANSID, Scan.IP, LAST(Scan.OS) as LASTOS













FROM Scan




GROUP BY Scan.IP
HAVING (((LAST(SCAN.OS)) IS NULL))
ORDER BY Scan.IP











!!! Sorpresa !!! LAST no es un comando SQL (Comprobado tambien en Shell)

No sè que cxxxxx hace el acces con esta sintax pero la hace
funcionar..

Alguna idea???? (mismo sugerencia de como formular esta query desde PHP)

Muchas Gracias a Todos

McClan
NOTA

HE intentado tambien
SELECT DISTINCT IP // pero como le meto otro campo al lado se pasa el
DISTINCT para el forro.












Respuesta Responder a este mensaje
#7 MAXI
06/12/2004 - 03:36 | Informe spam
Hola, claro que puedo explicartelo ;)

Tu me has dicho que tienes un campo ID que es el autonumerico y que luego
tienes un campo IP que es el que tiene el valor dado y la consulta es sacar
todos los ultimos registros y ver su ip verdad?

Entonces, los ultimos podrian ser en este caso la funcion MAX del campo ID y
agrupado por IP, o sea que para una misma IP me va a traer el maximo valor
de ID.

A esto lo puse en una tabla derivada y luego la vincule con JOIN con la
misma tabla, donde el max(id) = id.

Se entiende?




Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)
Mail: Maxi_accotto[arroba]speedy.com.ar

Msn Messenger:

"Mc_Clan" escribió en el mensaje
news:41b3619e$0$8131$
Me vas a perdonar, pero no comprendo para nada del codigo.

Lo he leido x veces y tengo los tipos del psiquiatrico que se me quieren
llevar de paseo.

Lo se que soy torpe, pero please, como los hecho hasta ahora, te pido
me lo explicas o tienes una pregunta de reserva?

gracias ;-)

un abrazo

Maxi a écrit :
Hola, pues bueno aca podemos usar una ventaja que dan los autonumericos
cuando se los usa de forma correcta.

Veamos este ejemplo.

SELECT T1.ID, T2.IP FROM (SELECT MAX(CAMPO_AUTONUMERICO) AS
ID, IP FROM TABLA GROUP BY IP) T1 INNER JOIN
(SELECT CAMPOAUTONUMERICO,IP FROM TABLA) T2 ON
T1.CAMPOAUTONUMERICO = T2.ID


pd: adaptablo bien a tu tabla por favor.

Un abrazo


"Mc_Clan" escribió en el mensaje
news:41b33aa6$0$9052$
Efectivamente, el uso correcto deberia ser el TOP + pero tengo ni
idea de como usar el TOP

La Base funciona asì:-
Todos los dias arranca un programa que escanea la classe B de la red,
escribe los datos en la base MSSQL, utilizando el campo ScansID como
campo numerico (Autoincrementacion) de identificacion del escaneo en
curso.
Por lo tanto el primer escan ha sido el 1 ahora estarà por el 40, a
veces los ordenadores escaneado estan apagado o se ha echo alguna
intervencion para meterlo en conformità de un referencial.
Bueno, si busco por ejemplo el ordenador 192.X.X.1 lo encontrarè tantas
veces cuantas veces ha sido encontrado para el motor de escan y por lo
tanto enumerado en ScansID ej.

ScansID IP
=> 1 192.X.X.1
4 192.X.X.1
9 192.X.X.1

Encontrado 3 Veces, donde la ultima vez es el ScansID 9

Haciendo un SELECT DISTINCT IP FROM Scan me dà como resultado 1 (ScansID
= 9) que es correcto, pero si añado otros campos al SELECT para sacar
una lista (que cante mas sobre estos IP) o meter unas condiciones (WHERE
OS IS NULL) pierdo este privilegio de SELECT DISTINCT e vuelve a
contarme todas las veces que la IP ha Aparecido.

Gracias
=> McClan


PS

estaba incorrecto, sorry

Maxi a écrit :

Hola, si el max no te es util has pensado en el TOP 1? el tema es qwue
debes definirme cual es el primer registro? con que criterio lo haces?

por ej: el que tiene la menor fecha?

Este concepto del last es un concepto de cursores y sqlserver como muchos
otros motores de BDD no estan diseñados ni optimizados para trabajar asi,
sino que trabajan con conjuntos de datos :)


"Mc_Clan" escribió en el mensaje
news:41b324ca$0$8117$


Ante de todo Muchissimas gracias por tu Ayuda,
La verdad es que me estoy volviendo loco.

Acabo de aprender porquè el LAST no funciona, por pura curiosidad lo
digo, aunque estoy seguro que ya lo sabes. LAST y FIRST Hacen parte del
dialecto JET-SQL y no de Transact-SQL, ademas no se aconseja el uso de
estos etc. etc. bueno, resultado, que el Access lo usa sin que se le pida
nada y desde PHP no logro hacer la query con el mismo resultado.

El Max no me funciona, te explico un poco aunque es realmente muy basico
por lo que probablemente por mi torpeza o desconocimiento me voy a dormir
hasta el año nuevo para la verguenza ;-)


Detalle:

Si hago:
SELECT DISTINCT IP FROM SCAN
// el resultado es 2608 = Correcto gracias a SELECT

Como intento añadir otros campos, vaya fiesta, ej.;
SELECT DISTINCT IP, OS FROM SCAN
// el resultado es 3400 = donde el campo IP se repite X veces :-(

//Ni hablar de meter condiciones a la query ej.;
SELECT DISTINCT IP FROM SCAN WHERE OS IS NULL
// BOOM 2457 = el resultado real es 334 :-(

Resumiendo, la estructura del DB es:
ScansID, IP, OS etc. etc.

Resultado buscado

1. Contar quantas maquinas han pasado por un scan (IP no repetidas)
//Con el DISTINCT todo OK, meno que no puedo listar nada, porquè
//como añado campos me cambia el resultado con los doblones "de oro"
;-)

2. Obtener el listado de las maquinas que han pasado por un scan
3. Obtener el listado con los campos OS Like '%WIN%'
4. Obtener el listado con los campos OS NOT Like '%WIN%'
5. Obtener el listado con los campos OS NULL


Otra vez Gracias por tu tiempo.

==>>>McClan



Maxi a écrit :


Hola, podrias usar la funcion MAX ya que SqlServer no numera bajo ningun
concepto los registros. Otra solucion es que definas un orden y armes un
aquery para numerar de menor a mayor por ej.

Fijate si con el MAX te es util, de lo contrario me avisas y te paso un
ej de como hacerlo de otra forma.

Abrazos


"Mc_Clan" escribió en el mensaje
news:41b28a4d$0$8115$



Hola a Todos,

Estudio una soluccion para obtener una lista con PHP desde un DataBase
MSSQL, parece facil ScansID, IP, OS ... donde el campo IP se
repite, como hacer para obtener los ultimos IP in relaccion al campo de
ScansID ?? mientras yo seguia obteniendo dobles de IP mi colega
haciendo una Query con Microsoft Acces lo logra sin dobles. Cojo la
query "de acces" que nos dà un resultado tan bonito y que es la
siguiente:-

SELECT MAX(Scan.ScansID) as MAXSCANSID, Scan.IP, LAST(Scan.OS) as










LASTOS



FROM Scan




GROUP BY Scan.IP
HAVING (((LAST(SCAN.OS)) IS NULL))
ORDER BY Scan.IP











!!! Sorpresa !!! LAST no es un comando SQL (Comprobado tambien en
Shell)

No sè que cxxxxx hace el acces con esta sintax pero la hace
funcionar..

Alguna idea???? (mismo sugerencia de como formular esta query desde
PHP)

Muchas Gracias a Todos

McClan
NOTA

HE intentado tambien
SELECT DISTINCT IP // pero como le meto otro campo al lado se pasa el
DISTINCT para el forro.












Respuesta Responder a este mensaje
#8 Liliana Sorrentino
06/12/2004 - 14:27 | Informe spam
Hola,
A ver si esto te sirve.
Generé una tabla temporal con datos de dos IP.
create table #scan
(scansID smallint,
ip char(20),
os char(20) null,
otros char(20))
insert #scan select 1, '192.X.X.1', null, 'otro dato 1'
insert #scan select 4, '192.X.X.1', 'WIN', 'otro dato 4'
insert #scan select 7, '192.X.X.1', 'OTRO', null
insert #scan select 9, '192.X.X.1', 'OTRO', 'otro dato 9'
insert #scan select 11, '193.X.X.1', null, 'otro dato 11'
insert #scan select 14, '193.X.X.1', 'WIN', 'otro dato 14'
insert #scan select 17, '193.X.X.1', 'OTRO', null
insert #scan select 19, '193.X.X.1', 'OTRO', 'otro dato 19'

tomando como ejemplo la forma de explicar de Javier Loria:
ip, sin condiciones
SELECT scansid = MAX(scansid), ip FROM #scan WHERE os IS NULL GROUP BY ip

tendrás todos los datos de ese scansid:
SELECT t1.scansid, t1.ip, t1.os, t1.otros
FROM #scan t1
INNER JOIN
(SELECT scansid = MAX(scansid), ip FROM #scan WHERE os IS NULL GROUP BY ip)
tmax
ON t1.scansid = tmax.scansid AND t1.ip = tmax.ip

Para las condiciones de nulos, no nulos, determinados valores, etc, solo es
necesario que agregues un WHERE en la tabla derivada.

Saludos, Liliana.

"Mc_Clan" escribió en el mensaje
news:41b3619e$0$8131$
Me vas a perdonar, pero no comprendo para nada del codigo.

Lo he leido x veces y tengo los tipos del psiquiatrico que se me quieren
llevar de paseo.

Lo se que soy torpe, pero please, como los hecho hasta ahora, te pido
me lo explicas o tienes una pregunta de reserva?

gracias ;-)

un abrazo

Maxi a écrit :
Hola, pues bueno aca podemos usar una ventaja que dan los autonumericos
cuando se los usa de forma correcta.

Veamos este ejemplo.

SELECT T1.ID, T2.IP FROM (SELECT MAX(CAMPO_AUTONUMERICO) AS
ID, IP FROM TABLA GROUP BY IP) T1 INNER JOIN
(SELECT CAMPOAUTONUMERICO,IP FROM TABLA) T2 ON
T1.CAMPOAUTONUMERICO = T2.ID


pd: adaptablo bien a tu tabla por favor.

Un abrazo


"Mc_Clan" escribió en el mensaje
news:41b33aa6$0$9052$
Efectivamente, el uso correcto deberia ser el TOP + pero tengo ni
idea de como usar el TOP

La Base funciona asì:-
Todos los dias arranca un programa que escanea la classe B de la red,
escribe los datos en la base MSSQL, utilizando el campo ScansID como
campo numerico (Autoincrementacion) de identificacion del escaneo en


curso.
Por lo tanto el primer escan ha sido el 1 ahora estarà por el 40, a
veces los ordenadores escaneado estan apagado o se ha echo alguna
intervencion para meterlo en conformità de un referencial.
Bueno, si busco por ejemplo el ordenador 192.X.X.1 lo encontrarè tantas
veces cuantas veces ha sido encontrado para el motor de escan y por lo
tanto enumerado en ScansID ej.

ScansID IP
=> 1 192.X.X.1
4 192.X.X.1
9 192.X.X.1

Encontrado 3 Veces, donde la ultima vez es el ScansID 9

Haciendo un SELECT DISTINCT IP FROM Scan me dà como resultado 1 (ScansID
= 9) que es correcto, pero si añado otros campos al SELECT para sacar
una lista (que cante mas sobre estos IP) o meter unas condiciones (WHERE
OS IS NULL) pierdo este privilegio de SELECT DISTINCT e vuelve a
contarme todas las veces que la IP ha Aparecido.

Gracias
=> McClan


PS

estaba incorrecto, sorry

Maxi a écrit :

Hola, si el max no te es util has pensado en el TOP 1? el tema es qwue
debes definirme cual es el primer registro? con que criterio lo haces?

por ej: el que tiene la menor fecha?

Este concepto del last es un concepto de cursores y sqlserver como muchos
otros motores de BDD no estan diseñados ni optimizados para trabajar asi,
sino que trabajan con conjuntos de datos :)


"Mc_Clan" escribió en el mensaje
news:41b324ca$0$8117$


Ante de todo Muchissimas gracias por tu Ayuda,
La verdad es que me estoy volviendo loco.

Acabo de aprender porquè el LAST no funciona, por pura curiosidad lo






digo,
aunque estoy seguro que ya lo sabes. LAST y FIRST Hacen parte del






dialecto
JET-SQL y no de Transact-SQL, ademas no se aconseja el uso de estos etc.
etc. bueno, resultado, que el Access lo usa sin que se le pida nada y
desde PHP no logro hacer la query con el mismo resultado.

El Max no me funciona, te explico un poco aunque es realmente muy basico
por lo que probablemente por mi torpeza o desconocimiento me voy a dormir
hasta el año nuevo para la verguenza ;-)


Detalle:

Si hago:
SELECT DISTINCT IP FROM SCAN
// el resultado es 2608 = Correcto gracias a SELECT

Como intento añadir otros campos, vaya fiesta, ej.;
SELECT DISTINCT IP, OS FROM SCAN
// el resultado es 3400 = donde el campo IP se repite X veces :-(

//Ni hablar de meter condiciones a la query ej.;
SELECT DISTINCT IP FROM SCAN WHERE OS IS NULL
// BOOM 2457 = el resultado real es 334 :-(

Resumiendo, la estructura del DB es:
ScansID, IP, OS etc. etc.

Resultado buscado

1. Contar quantas maquinas han pasado por un scan (IP no repetidas)
//Con el DISTINCT todo OK, meno que no puedo listar nada, porquè
//como añado campos me cambia el resultado con los doblones "de oro"
;-)

2. Obtener el listado de las maquinas que han pasado por un scan
3. Obtener el listado con los campos OS Like '%WIN%'
4. Obtener el listado con los campos OS NOT Like '%WIN%'
5. Obtener el listado con los campos OS NULL


Otra vez Gracias por tu tiempo.

==>>>McClan



Maxi a écrit :


Hola, podrias usar la funcion MAX ya que SqlServer no numera bajo ningun
concepto los registros. Otra solucion es que definas un orden y armes un
aquery para numerar de menor a mayor por ej.

Fijate si con el MAX te es util, de lo contrario me avisas y te paso un
ej de como hacerlo de otra forma.

Abrazos


"Mc_Clan" escribió en el mensaje
news:41b28a4d$0$8115$



Hola a Todos,

Estudio una soluccion para obtener una lista con PHP desde un DataBase
MSSQL, parece facil ScansID, IP, OS ... donde el campo IP se
repite, como hacer para obtener los ultimos IP in relaccion al campo de
ScansID ?? mientras yo seguia obteniendo dobles de IP mi colega










haciendo
una Query con Microsoft Acces lo logra sin dobles. Cojo la query "de
acces" que nos dà un resultado tan bonito y que es la siguiente:-

SELECT MAX(Scan.ScansID) as MAXSCANSID, Scan.IP, LAST(Scan.OS) as




















LASTOS

FROM Scan




GROUP BY Scan.IP
HAVING (((LAST(SCAN.OS)) IS NULL))
ORDER BY Scan.IP











!!! Sorpresa !!! LAST no es un comando SQL (Comprobado tambien en










Shell)

No sè que cxxxxx hace el acces con esta sintax pero la hace
funcionar..

Alguna idea???? (mismo sugerencia de como formular esta query desde










PHP)

Muchas Gracias a Todos

McClan
NOTA

HE intentado tambien
SELECT DISTINCT IP // pero como le meto otro campo al lado se pasa el
DISTINCT para el forro.












email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida