Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Consulta NOVATO MSSQL

Estas en el tema de Consulta NOVATO MSSQL en el foro de SQL Server en Foros del Web. Bueno, antes que nada soy nuevo (en el foro y en el tema de bd) asi que tenganme paciencia jeje. Vamos al grano, tengo que ...
  #1 (permalink)  
Antiguo 04/02/2009, 09:40
 
Fecha de Ingreso: febrero-2009
Mensajes: 9
Antigüedad: 15 años, 3 meses
Puntos: 0
Consulta NOVATO MSSQL

Bueno, antes que nada soy nuevo (en el foro y en el tema de bd) asi que tenganme paciencia jeje. Vamos al grano, tengo que resolver una consulta (supuestamente re facil) con las bases de datos de ejemplo en MSSQL server 2000, puntualmente la bd pubs. Tengo que obtener el listado de apellidos y nombres de autores juntos a los titulos de las publicaciones de su auditoria y ordenarla por autor. Yo lo hice de la siguiente manera, pero me gustaria opinen acerca de como mejorar la sintaxis y la eficiencia de la sentencia.

SELECT A.au_lname,A.au_fname,Aux.title FROM authors A
INNER JOIN (SELECT Ta.au_id,Ti.title FROM titleauthor Ta INNER JOIN titles Ti ON Ta.title_id = Ti.title_id)Aux
ON A.au_id = Aux.au_id
ORDER BY A.au_lname

Saludos y gracias!
  #2 (permalink)  
Antiguo 04/02/2009, 10:29
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Respuesta: Consulta NOVATO MSSQL

La misma sentencia, eliminando subquerys...

Código:
SELECT A.au_lname,A.au_fname,Ti.title 
FROM authors A
INNER JOIN titleauthor Ta 
ON A.au_id = Ta.au_id
INNER JOIN titles Ti 
ON Ta.title_id = Ti.title_id
ORDER BY A.au_lname

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #3 (permalink)  
Antiguo 04/02/2009, 10:48
 
Fecha de Ingreso: febrero-2009
Mensajes: 9
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Consulta NOVATO MSSQL

Muchas gracias! Hace un rato estaba indagando acerca de eso e hice mi primer consulta evitando las subquerys. En este caso tenia que obtener un listado mostrando los ingresos (pre*cant) proporcionado por cada autor a partir de las ventas de publicaciones; y me ha quedado lo siguiente:

SELECT au_lname,au_fname,SUM(price*qty) as 'Ingresos' FROM authors A
INNER JOIN (titleauthor Ta
INNER JOIN (titles Ti
INNER JOIN sales S
ON Ti.title_id = S.title_id)
ON Ta.title_id = Ti.title_id)
ON Ta.au_id = A.au_id
group by au_lname,au_fname
ORDER BY 'Ingresos'DESC

Gracias por contestar tan rapido!
  #4 (permalink)  
Antiguo 04/02/2009, 11:09
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Respuesta: Consulta NOVATO MSSQL

jejeje aunque me suena a que es una tarea escolar...

En fin, por ahi puedes seguir investigando...


Código:
SELECT      A.au_lname
           ,A.au_fname
           ,SUM(isnull(Ti.price,0) * isnull(s.qty,0) ) as 'Ingresos'
FROM        authors A
INNER JOIN  titleauthor Ta 
ON          A.au_id = Ta.au_id
INNER JOIN  titles Ti 
ON          Ta.title_id = Ti.title_id
LEFT OUTER JOIN  sales s
ON          Ti.title_id = S.title_id
GROUP BY    au_lname,au_fname
ORDER BY    A.au_lname
Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #5 (permalink)  
Antiguo 04/02/2009, 11:16
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Respuesta: Consulta NOVATO MSSQL

Cierto, deberia haber un festejo especial del "dia del maestro" para algunos de este foro.

Saludos teacher Andres
  #6 (permalink)  
Antiguo 04/02/2009, 11:19
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Respuesta: Consulta NOVATO MSSQL



jejeje

Lo cierto, es que hubo un tiempo en el que imparti clases en un colegio a nivel preparatoria..

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #7 (permalink)  
Antiguo 04/02/2009, 11:36
 
Fecha de Ingreso: febrero-2009
Mensajes: 9
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Consulta NOVATO MSSQL

Jaja, no son los ejercicios 1,2 o 3 de las guias de "Base de Datos" de mi facultad jeje y quiero adoptar una buena metodologia de programacion es por ello que pegue codigo y pedi consejos . Muchas gracias por todos los consejos, cualquier duda pegare otro ejercicio por aqui para ver que tal jeje. Gracias!
  #8 (permalink)  
Antiguo 05/02/2009, 10:48
 
Fecha de Ingreso: febrero-2009
Mensajes: 9
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Consulta NOVATO MSSQL

Disculpen, molesto de nuevo para un consejo. Tema: begin, rollback y commit transaction. Supongamos que dentro de un bucle tengo sentencias que modifican columnas, los comandos de transaction conviene ubicarlos dentro del bucle identificando los errores en cada iteracion o fuera? Segun vengo leyendo, se trata todo como unidad es decir, si algo fracasa -> fracasa todo. Entonces, seria conveniente ubicar las transactions antes de inicializar el batch/script (es decir, antes del bucle en este ejemplo) y concluirlo o bien por llegar al final o bien por un error.
Ademas, si existieran errores y nosotros insertaramos filas iguales, despues tendriamos problemas con ubicar cuales filas tuvieron problemas y porque no se insertaron, como conclusion creo que la forma correcta es iniciar la transaccion al comienzo, ejecutar el bucle (o lo que fuere) y si esta todo bien hacer commit, de otra forma hacer rollback.
  #9 (permalink)  
Antiguo 05/02/2009, 15:26
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Respuesta: Consulta NOVATO MSSQL

Lo ultimo que mencionas, es lo aconsejable. (algo asi..............)

DECLARE @ERROR INT
SET @ERROR INT
BEGIN TRAN <name_tran>
WHILE................
UPDATE............
IF @@ROWCOUNT = 0
BEGIN
SET @ERROR = 9
ROLLBACK TRAN <name_tran>
BREAK
END
CONTINUE
END
IF @@ERRROR = 9
RETURN(0)
COMMIT TRAN <name_tran>
  #10 (permalink)  
Antiguo 05/02/2009, 17:29
 
Fecha de Ingreso: febrero-2009
Mensajes: 9
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Consulta NOVATO MSSQL

Así es, aca hay algo que hice ayer con cursores y transacciones en MSSQL, es pequeño pero sirve para expresar la idea.


BEGIN TRANSACTION

DECLARE curTit CURSOR
FOR SELECT title,type,price,ytd_sales FROM titles
FOR UPDATE

OPEN curTit


SET NOCOUNT ON

DECLARE @va integer,
@tipo varchar(20),
@titulo varchar(20),
@precio money
SET @va = 0

FETCH NEXT FROM curTit INTO @titulo,@tipo,@precio,@va

WHILE @@fetch_status = 0
BEGIN
IF @@error <> 0
BEGIN
ROLLBACK TRANSACTION
RETURN
END
IF @va > 1000 UPDATE titles SET price = price * 0.9 WHERE CURRENT OF curTit
ELSE
BEGIN
IF @tipo = 'popular_comp' OR @titulo LIKE ('%computer%') UPDATE titles SET price = price * 0.5 WHERE CURRENT OF curTit
ELSE UPDATE titles SET price = price * 0.75 WHERE CURRENT OF curTit
END
FETCH NEXT FROM curTit INTO @titulo,@tipo,@precio,@va
END

CLOSE curTit

DEALLOCATE curTit

COMMIT TRANSACTION

GO


Faltan validaciones, pero la idea general es esa.
  #11 (permalink)  
Antiguo 06/02/2009, 08:35
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Respuesta: Consulta NOVATO MSSQL

Como recomendacion: Evita el uso de cursores...

- Como primera opcion trata de replantear el proceso en cuestion con sentencias masivas.

- Si de plano no se puede usa Variables tipo tabla para realizar la iteracion.

SQL Server funciona mucho mejor cuando haces operaciones masivas que cuando haces ciclos.

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #12 (permalink)  
Antiguo 06/02/2009, 10:49
 
Fecha de Ingreso: febrero-2009
Mensajes: 9
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Consulta NOVATO MSSQL

Cita:
Iniciado por Andres95 Ver Mensaje
Como recomendacion: Evita el uso de cursores...

- Como primera opcion trata de replantear el proceso en cuestion con sentencias masivas.

- Si de plano no se puede usa Variables tipo tabla para realizar la iteracion.

SQL Server funciona mucho mejor cuando haces operaciones masivas que cuando haces ciclos.

Saludos!
Muchas gracias, sera tenida en cuenta!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:15.