Select correcto?

12/12/2005 - 08:49 por José Antonio | Informe spam
Es correcto este select?

SELECT CODIGO,CASE TIPO WHEN 'A' THEN A.NOMBRE WHEN 'B' THEN B.NOMBRE WHEN
'C' THEN C.NOMBRE ELSE 'SIN NOMBRE' END AS NOMBRE FROM TABLA T LEFT JOIN A
ON A.CODIGO=T.CODIGO LEFT JOIN B ON B.CODIGO=T.CODIGO LEFT JOIN C ON
C.CODIGO=T.CODIGO

Funciona, pero no se si es la mejor manera de hacerlo.
Hay alguna recomendacion al respecto?


Saludos.

Preguntas similare

Leer las respuestas

#1 Eladio Rincón
12/12/2005 - 09:42 | Informe spam
yo lo cambiaría por:


create proc tu_proc @tipo char(1)
as

if @tipo = 'A'
SELECT CODIGO, A.NOMBRE NOMBRE FROM
TABLA T LEFT JOIN A
ON A.CODIGO=T.CODIGO

if @tipo = 'B'
SELECT CODIGO, B.NOMBRE NOMBRE FROM
TABLA T LEFT JOIN B
ON B.CODIGO=T.CODIGO

if @tipo = 'C'
SELECT CODIGO, C.NOMBRE NOMBRE FROM
TABLA T LEFT JOIN C
ON C.CODIGO=T.CODIGO

if @tipo = 'D'
SELECT CODIGO, D.NOMBRE NOMBRE FROM
TABLA T LEFT JOIN D
ON D.CODIGO=T.CODIGO

GO

piensa que en tu ejemplo estás cruzando siempre las cuatro tablas, mientras
que en el proc de ejemplo sólo cruzarías la tabla necesaria

Eladio Rincón

SQL Server MVP, Mentor
Solid Quality Learning
http://www.SolidQualityLearning.com

"Solid Quality Learning is the trusted global provider of advanced education
and solutions for the entire Microsoft database platform"


"José Antonio" wrote in message
news:ONeqeCv$
Es correcto este select?

SELECT CODIGO,CASE TIPO WHEN 'A' THEN A.NOMBRE WHEN 'B' THEN B.NOMBRE WHEN
'C' THEN C.NOMBRE ELSE 'SIN NOMBRE' END AS NOMBRE FROM TABLA T LEFT JOIN A
ON A.CODIGO=T.CODIGO LEFT JOIN B ON B.CODIGO=T.CODIGO LEFT JOIN C ON
C.CODIGO=T.CODIGO

Funciona, pero no se si es la mejor manera de hacerlo.
Hay alguna recomendacion al respecto?


Saludos.

Respuesta Responder a este mensaje
#2 Salvador Ramos
12/12/2005 - 09:44 | Informe spam
Podrías indicar la estructura de tus tablas y las Relaciones entre ellas ?

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL Server y .NET)


"José Antonio" escribió en el
mensaje news:ONeqeCv$
Es correcto este select?

SELECT CODIGO,CASE TIPO WHEN 'A' THEN A.NOMBRE WHEN 'B' THEN B.NOMBRE WHEN
'C' THEN C.NOMBRE ELSE 'SIN NOMBRE' END AS NOMBRE FROM TABLA T LEFT JOIN A
ON A.CODIGO=T.CODIGO LEFT JOIN B ON B.CODIGO=T.CODIGO LEFT JOIN C ON
C.CODIGO=T.CODIGO

Funciona, pero no se si es la mejor manera de hacerlo.
Hay alguna recomendacion al respecto?


Saludos.

Respuesta Responder a este mensaje
#3 José Antonio
12/12/2005 - 10:10 | Informe spam
La tabla TABLA se compone de un TIPO que indica si es un grupo, una familia
o un producto, el CODIGO indica el codigo de ese grupo o familia o producto
y despues tiene todos los campos que son comunes a los tres tipos, que son
muchos.
La PK en esta tabla es TIPO+CODIGO.

Las demas tabla solo tienen el codigo y el nombre la PK es el codigo.

Dependiendo del TIPO de TABLA necesito coger el nombre correspondiente al
grupo,familia o producto para visualizarlo un un grid.

No he definido tres tablas porque los datos comunes son muchos y lo unico
que cambia es si el codigo pertenece a un grupo,familia o producto.

Serie mejor tener tres tablas diferentes?

El ejemplo de eladio no me es valido, ya que el TIPO pertenece a las filas
de la tabla no es una variable externa.

Saludos

"José Antonio" escribió en el
mensaje news:ONeqeCv$
Es correcto este select?

SELECT CODIGO,CASE TIPO WHEN 'A' THEN A.NOMBRE WHEN 'B' THEN B.NOMBRE WHEN
'C' THEN C.NOMBRE ELSE 'SIN NOMBRE' END AS NOMBRE FROM TABLA T LEFT JOIN A
ON A.CODIGO=T.CODIGO LEFT JOIN B ON B.CODIGO=T.CODIGO LEFT JOIN C ON
C.CODIGO=T.CODIGO

Funciona, pero no se si es la mejor manera de hacerlo.
Hay alguna recomendacion al respecto?


Saludos.

Respuesta Responder a este mensaje
#4 Alejandro Mesa
12/12/2005 - 16:28 | Informe spam
Trata:

SELECT
CODIGO,
A.NOMBRE
FROM
TABLA T
INNER JOIN
A
ON A.CODIGO = T.CODIGO AND T.TIPO = 'A'

UNION ALL

SELECT
CODIGO,
B.NOMBRE
FROM
TABLA T
INNER JOIN
B
ON B.CODIGO = T.CODIGO AND T.TIPO = 'B'

UNION ALL

SELECT
CODIGO,
A.NOMBRE
FROM
TABLA T
INNER JOIN
C
ON C.CODIGO = T.CODIGO AND T.TIPO = 'C'

UNION ALL

SELECT
CODIGO,
'SIN NOMBRE' AS NOMBRE
FROM
TABLA T
WHERE
(TIPO != 'A' AND TIPO != 'B' AND TIPO != 'C')

UNION ALL

SELECT
CODIGO,
'SIN NOMBRE' AS NOMBRE
FROM
TABLA T
WHERE
TIPO IS NULL
GO


De todas maneras es dificil predecir cual version es peor o mejor si no
sabemos la estructura de tus tablas, incluyendo constraints, DRI e indices,
como bien menciono Salvador.

Te recomiendo compares los planes de ejecucion antes de tomar una decision.


AMB

"José Antonio" wrote:

La tabla TABLA se compone de un TIPO que indica si es un grupo, una familia
o un producto, el CODIGO indica el codigo de ese grupo o familia o producto
y despues tiene todos los campos que son comunes a los tres tipos, que son
muchos.
La PK en esta tabla es TIPO+CODIGO.

Las demas tabla solo tienen el codigo y el nombre la PK es el codigo.

Dependiendo del TIPO de TABLA necesito coger el nombre correspondiente al
grupo,familia o producto para visualizarlo un un grid.

No he definido tres tablas porque los datos comunes son muchos y lo unico
que cambia es si el codigo pertenece a un grupo,familia o producto.

Serie mejor tener tres tablas diferentes?

El ejemplo de eladio no me es valido, ya que el TIPO pertenece a las filas
de la tabla no es una variable externa.

Saludos

"José Antonio" escribió en el
mensaje news:ONeqeCv$
> Es correcto este select?
>
> SELECT CODIGO,CASE TIPO WHEN 'A' THEN A.NOMBRE WHEN 'B' THEN B.NOMBRE WHEN
> 'C' THEN C.NOMBRE ELSE 'SIN NOMBRE' END AS NOMBRE FROM TABLA T LEFT JOIN A
> ON A.CODIGO=T.CODIGO LEFT JOIN B ON B.CODIGO=T.CODIGO LEFT JOIN C ON
> C.CODIGO=T.CODIGO
>
> Funciona, pero no se si es la mejor manera de hacerlo.
> Hay alguna recomendacion al respecto?
>
>
> Saludos.
>



Respuesta Responder a este mensaje
#5 José Antonio
13/12/2005 - 11:45 | Informe spam
Gracias, comprobare esta nueva opcion.

Saludos
"Alejandro Mesa" escribió en el
mensaje news:
Trata:

SELECT
CODIGO,
A.NOMBRE
FROM
TABLA T
INNER JOIN
A
ON A.CODIGO = T.CODIGO AND T.TIPO = 'A'

UNION ALL

SELECT
CODIGO,
B.NOMBRE
FROM
TABLA T
INNER JOIN
B
ON B.CODIGO = T.CODIGO AND T.TIPO = 'B'

UNION ALL

SELECT
CODIGO,
A.NOMBRE
FROM
TABLA T
INNER JOIN
C
ON C.CODIGO = T.CODIGO AND T.TIPO = 'C'

UNION ALL

SELECT
CODIGO,
'SIN NOMBRE' AS NOMBRE
FROM
TABLA T
WHERE
(TIPO != 'A' AND TIPO != 'B' AND TIPO != 'C')

UNION ALL

SELECT
CODIGO,
'SIN NOMBRE' AS NOMBRE
FROM
TABLA T
WHERE
TIPO IS NULL
GO


De todas maneras es dificil predecir cual version es peor o mejor si no
sabemos la estructura de tus tablas, incluyendo constraints, DRI e
indices,
como bien menciono Salvador.

Te recomiendo compares los planes de ejecucion antes de tomar una
decision.


AMB

"José Antonio" wrote:

La tabla TABLA se compone de un TIPO que indica si es un grupo, una
familia
o un producto, el CODIGO indica el codigo de ese grupo o familia o
producto
y despues tiene todos los campos que son comunes a los tres tipos, que
son
muchos.
La PK en esta tabla es TIPO+CODIGO.

Las demas tabla solo tienen el codigo y el nombre la PK es el codigo.

Dependiendo del TIPO de TABLA necesito coger el nombre correspondiente al
grupo,familia o producto para visualizarlo un un grid.

No he definido tres tablas porque los datos comunes son muchos y lo unico
que cambia es si el codigo pertenece a un grupo,familia o producto.

Serie mejor tener tres tablas diferentes?

El ejemplo de eladio no me es valido, ya que el TIPO pertenece a las
filas
de la tabla no es una variable externa.

Saludos

"José Antonio" escribió en el
mensaje news:ONeqeCv$
> Es correcto este select?
>
> SELECT CODIGO,CASE TIPO WHEN 'A' THEN A.NOMBRE WHEN 'B' THEN B.NOMBRE
> WHEN
> 'C' THEN C.NOMBRE ELSE 'SIN NOMBRE' END AS NOMBRE FROM TABLA T LEFT
> JOIN A
> ON A.CODIGO=T.CODIGO LEFT JOIN B ON B.CODIGO=T.CODIGO LEFT JOIN C ON
> C.CODIGO=T.CODIGO
>
> Funciona, pero no se si es la mejor manera de hacerlo.
> Hay alguna recomendacion al respecto?
>
>
> Saludos.
>



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