JOIN Y COMPARACIONES

06/10/2007 - 17:13 por Francisco | Informe spam
Hola, buenas tardes:

Estoy intentando comparar dos tablas a través de un "Join", el caso es que
en una tabla tengo un campo que tiene un número de teléfono; en la otra
tabla tengo otro campo que contiene al menos dos números de teléfono. Lo que
quiero hacer es que compare ambas tablas para que busque uno de los dos
números de teléfono y me de el nombre del Proveedor que ha llamado. He
probado de varias formas pero solo me compara con el primer número y por
tanto despues no sigue la busqueda.

TABLA_CALL_LOG

HORA DE LLAMADA TELEFONO
06/10/07 91254788


TABLA PROVEEDORES

PROVEEDOR TELEFONOS
CARNICERIA 91254789 91254788

Lo que quiero es que el "join" pueda buscar el segundo número tambien y
devolverme el nombre del que llama.

Ahora mismo lo tengo así:

SELECT dbo.[callLog-2007-10].Telefono,
dbo.PROVEEDORES_UNION.NomProveedor, dbo.PROVEEDORES_UNION.Telefono

FROM dbo.[callLog-2007-10] LEFT OUTER JOIN
dbo.PROVEEDORES_UNION ON
dbo.[callLog-2007-10].Telefono = dbo.PROVEEDORES_UNION.Telefono

Muchas gracias.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
07/10/2007 - 01:54 | Informe spam
Hola Francisco,

Los dos #s de telefono estan almacenado en la misma columna?

En ese caso te recomiendo que veas la posibilidad de normalizar esa tabla.
El valor de una columna debe ser atomico, no un grupo o lista.

Cuando espongas este tipo de problemas, se recomienda que se postee la
estructura de las tablas involucradas, data de ejemplo en forma de sentencias
"insert" y resultado esperado. La ayuda debe ser mutua, no crees?

Como no nos dices cual es el tipo de dato de ambas columnas, voy a suponer
que son VARCHAR, entonces puedes usar

SELECT
a.Telefono,
b.NomProveedor,
b.Telefono
FROM
dbo.[callLog-2007-10] as a
LEFT OUTER JOIN
dbo.PROVEEDORES_UNION as b
ON b.Telefono LIKE '%' + a.Telefono + '%'
go

Nota que ese tipo de expresion no ayuda a que el optimizador de queries use
las estadisticas de los indices, en caso de que estos existan, ya que se esta
manipulando la columna en la expresion.


AMB

"Francisco" wrote:

Hola, buenas tardes:

Estoy intentando comparar dos tablas a través de un "Join", el caso es que
en una tabla tengo un campo que tiene un número de teléfono; en la otra
tabla tengo otro campo que contiene al menos dos números de teléfono. Lo que
quiero hacer es que compare ambas tablas para que busque uno de los dos
números de teléfono y me de el nombre del Proveedor que ha llamado. He
probado de varias formas pero solo me compara con el primer número y por
tanto despues no sigue la busqueda.

TABLA_CALL_LOG

HORA DE LLAMADA TELEFONO
06/10/07 91254788


TABLA PROVEEDORES

PROVEEDOR TELEFONOS
CARNICERIA 91254789 91254788

Lo que quiero es que el "join" pueda buscar el segundo número tambien y
devolverme el nombre del que llama.

Ahora mismo lo tengo así:

SELECT dbo.[callLog-2007-10].Telefono,
dbo.PROVEEDORES_UNION.NomProveedor, dbo.PROVEEDORES_UNION.Telefono

FROM dbo.[callLog-2007-10] LEFT OUTER JOIN
dbo.PROVEEDORES_UNION ON
dbo.[callLog-2007-10].Telefono = dbo.PROVEEDORES_UNION.Telefono

Muchas gracias.



Respuesta Responder a este mensaje
#2 Francisco
07/10/2007 - 11:42 | Informe spam
Hola Alejandro,

Pedona por no poner la estructura de tipo de dato en el post anterior, pero
si que acertaste con el tipo de dato, es varchar.

Lo que pasa que sigue igual, no sigue la búsqueda en el string del campo.

Lo que he pensado en dividir ese campo en el caso que tuviera dos o más
números de teléfono almacenados.

"Alejandro Mesa" escribió en el
mensaje news:
Hola Francisco,

Los dos #s de telefono estan almacenado en la misma columna?

En ese caso te recomiendo que veas la posibilidad de normalizar esa tabla.
El valor de una columna debe ser atomico, no un grupo o lista.

Cuando espongas este tipo de problemas, se recomienda que se postee la
estructura de las tablas involucradas, data de ejemplo en forma de
sentencias
"insert" y resultado esperado. La ayuda debe ser mutua, no crees?

Como no nos dices cual es el tipo de dato de ambas columnas, voy a suponer
que son VARCHAR, entonces puedes usar

SELECT
a.Telefono,
b.NomProveedor,
b.Telefono
FROM
dbo.[callLog-2007-10] as a
LEFT OUTER JOIN
dbo.PROVEEDORES_UNION as b
ON b.Telefono LIKE '%' + a.Telefono + '%'
go

Nota que ese tipo de expresion no ayuda a que el optimizador de queries
use
las estadisticas de los indices, en caso de que estos existan, ya que se
esta
manipulando la columna en la expresion.


AMB

"Francisco" wrote:

Hola, buenas tardes:

Estoy intentando comparar dos tablas a través de un "Join", el caso es
que
en una tabla tengo un campo que tiene un número de teléfono; en la otra
tabla tengo otro campo que contiene al menos dos números de teléfono. Lo
que
quiero hacer es que compare ambas tablas para que busque uno de los dos
números de teléfono y me de el nombre del Proveedor que ha llamado. He
probado de varias formas pero solo me compara con el primer número y por
tanto despues no sigue la busqueda.

TABLA_CALL_LOG

HORA DE LLAMADA TELEFONO
06/10/07 91254788


TABLA PROVEEDORES

PROVEEDOR TELEFONOS
CARNICERIA 91254789 91254788

Lo que quiero es que el "join" pueda buscar el segundo número tambien y
devolverme el nombre del que llama.

Ahora mismo lo tengo así:

SELECT dbo.[callLog-2007-10].Telefono,
dbo.PROVEEDORES_UNION.NomProveedor, dbo.PROVEEDORES_UNION.Telefono

FROM dbo.[callLog-2007-10] LEFT OUTER JOIN
dbo.PROVEEDORES_UNION ON
dbo.[callLog-2007-10].Telefono = dbo.PROVEEDORES_UNION.Telefono

Muchas gracias.



Respuesta Responder a este mensaje
#3 Alejandro Mesa
07/10/2007 - 16:44 | Informe spam
Hola Francisco,

CREATE TABLE #TABLA_CALL_LOG (
[HORA DE LLAMADA] DATETIME,
TELEFONO VARCHAR(25)
)

INSERT INTO [#TABLA_CALL_LOG] VALUES ('20071006', '91254788')

CREATE TABLE #TABLA_PROVEEDORES (
PROVEEDOR VARCHAR(50),
TELEFONOS VARCHAR(250)
)

INSERT INTO #TABLA_PROVEEDORES VALUES('CARNICERIA', '91254789 91254788')
GO

SELECT
a.TELEFONO,
b.PROVEEDOR,
b.TELEFONOS
FROM
#TABLA_CALL_LOG as a
LEFT OUTER JOIN
#TABLA_PROVEEDORES as b
ON b.TELEFONOS LIKE '%' + a.TELEFONO + '%'
GO

DROP TABLE [#TABLA_CALL_LOG], [#TABLA_PROVEEDORES]
GO

Lo que he pensado en dividir ese campo en el caso que tuviera dos o más
números de teléfono almacenados.



Esa no es la forma correcta de resolver este problema. Tu tabla seguira sin
cumplir 1ra forma normal.

Lo que debes hacer es crear una segunda tabla con la estructura sgte:

CREATE TABLE dbo.TABLA_CALL_LOG (
[HORA DE LLAMADA] DATETIME,
TELEFONO VARCHAR(25)
)

INSERT INTO dbo.TABLA_CALL_LOG VALUES ('20071006', '91254788')
GO

CREATE TABLE dbo.TABLA_PROVEEDORES (
PROVEEDOR_ID INT NOT NULL IDENTITY PRIMARY KEY,
NOMBRE VARCHAR(50)
)

INSERT INTO dbo.TABLA_PROVEEDORES(NOMBRE) VALUES('CARNICERIA')
GO

CREATE TABLE dbo.PROVEEDOR_TELEFONO (
[ID] INT NOT NULL IDENTITY PRIMARY KEY,
PROVEEDOR_ID INT NOT NULL REFERENCES dbo.TABLA_PROVEEDORES(PROVEEDOR_ID),
TELEFONO VARCHAR(25) NOT NULL,
CONSTRAINT UQ_PROVEEDOR_ID_TELEFONO UNIQUE (PROVEEDOR_ID, TELEFONO)
)

INSERT INTO dbo.PROVEEDOR_TELEFONO([PROVEEDOR_ID], TELEFONO) VALUES(1,
'91254789')
INSERT INTO dbo.PROVEEDOR_TELEFONO([PROVEEDOR_ID], TELEFONO) VALUES(1,
'91254788')
GO

SELECT
a.TELEFONO,
b.PROVEEDOR_ID,
b.[NOMBRE],
c.TELEFONO
FROM
dbo.TABLA_CALL_LOG as a
LEFT OUTER JOIN
(
dbo.TABLA_PROVEEDORES as b
INNER JOIN
dbo.PROVEEDOR_TELEFONO AS c
ON b.[PROVEEDOR_ID] = c.[PROVEEDOR_ID]
)
ON a.[TELEFONO] = c.TELEFONO
GO

dbo.TABLA_PROVEEDORES
GO


AMB

"Francisco" wrote:

Hola Alejandro,

Pedona por no poner la estructura de tipo de dato en el post anterior, pero
si que acertaste con el tipo de dato, es varchar.

Lo que pasa que sigue igual, no sigue la búsqueda en el string del campo.

Lo que he pensado en dividir ese campo en el caso que tuviera dos o más
números de teléfono almacenados.

"Alejandro Mesa" escribió en el
mensaje news:
> Hola Francisco,
>
> Los dos #s de telefono estan almacenado en la misma columna?
>
> En ese caso te recomiendo que veas la posibilidad de normalizar esa tabla.
> El valor de una columna debe ser atomico, no un grupo o lista.
>
> Cuando espongas este tipo de problemas, se recomienda que se postee la
> estructura de las tablas involucradas, data de ejemplo en forma de
> sentencias
> "insert" y resultado esperado. La ayuda debe ser mutua, no crees?
>
> Como no nos dices cual es el tipo de dato de ambas columnas, voy a suponer
> que son VARCHAR, entonces puedes usar
>
> SELECT
> a.Telefono,
> b.NomProveedor,
> b.Telefono
> FROM
> dbo.[callLog-2007-10] as a
> LEFT OUTER JOIN
> dbo.PROVEEDORES_UNION as b
> ON b.Telefono LIKE '%' + a.Telefono + '%'
> go
>
> Nota que ese tipo de expresion no ayuda a que el optimizador de queries
> use
> las estadisticas de los indices, en caso de que estos existan, ya que se
> esta
> manipulando la columna en la expresion.
>
>
> AMB
>
> "Francisco" wrote:
>
>> Hola, buenas tardes:
>>
>> Estoy intentando comparar dos tablas a través de un "Join", el caso es
>> que
>> en una tabla tengo un campo que tiene un número de teléfono; en la otra
>> tabla tengo otro campo que contiene al menos dos números de teléfono. Lo
>> que
>> quiero hacer es que compare ambas tablas para que busque uno de los dos
>> números de teléfono y me de el nombre del Proveedor que ha llamado. He
>> probado de varias formas pero solo me compara con el primer número y por
>> tanto despues no sigue la busqueda.
>>
>> TABLA_CALL_LOG
>>
>> HORA DE LLAMADA TELEFONO
>> 06/10/07 91254788
>>
>>
>> TABLA PROVEEDORES
>>
>> PROVEEDOR TELEFONOS
>> CARNICERIA 91254789 91254788
>>
>> Lo que quiero es que el "join" pueda buscar el segundo número tambien y
>> devolverme el nombre del que llama.
>>
>> Ahora mismo lo tengo así:
>>
>> SELECT dbo.[callLog-2007-10].Telefono,
>> dbo.PROVEEDORES_UNION.NomProveedor, dbo.PROVEEDORES_UNION.Telefono
>>
>> FROM dbo.[callLog-2007-10] LEFT OUTER JOIN
>> dbo.PROVEEDORES_UNION ON
>> dbo.[callLog-2007-10].Telefono = dbo.PROVEEDORES_UNION.Telefono
>>
>> Muchas gracias.
>>
>>
>>



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