2009-10-12 9 views
5

Tengo que escribir una versión válida de T-SQL de consulta de la siguiente pseudo-código:¿Cómo puedo escribir una consulta T-SQL para hacer un "me gusta"?

select * from newTable where [name] like in (
    select [name] from oldTable 
) 

No estoy seguro de cómo hacer esto. Cualquier ayuda (incluso dirigirme a una pregunta existente) sería genial. ¡Gracias!

Edit: Por algunos comentarios aclararé este caso en particular. Las tablas tienen el siguiente aspecto:

oldTable 
code varchar(10) 
name varchar(500) 

newTable 
code varchar(10) 
name varchar(500) 

En todos los casos en los que oldTable.code <> newTable.code, que estoy queriendo ver si el oldTable.name es como uno de los nombres en newTable.name. Básicamente, algunos de los nuevos nombres han agregado calificadores al comienzo o al final de los nombres. es decir: 'nombre antiguo' puede tener un 'nombre antiguo calificado' en la nueva tabla. Gracias de nuevo.

+0

¿qué tal algunos ejemplos de nombres nuevos y viejos que son "como" y algunos que "no se parecen" entre sí? –

+0

puede dar algunos datos de muestra; tiene varias soluciones a continuación que pueden funcionar, pero dependen mucho de cómo se almacenan los datos. –

+1

@ Aaron Palmer, debe dar ejemplos reales de nombres antiguos y nuevos nombres, y si son "similares" entre sí. ¿El viejo "bbb" coincide con el nuevo "xbbb"? ¿El viejo "xyz" coincide con "abc"? el viejo "abcxyz" coincide con "abc", etc. si no quiere dar ejemplos, proporcione las reglas para encontrar coincidencias. –

Respuesta

1

creo que sólo tiene que quitar el ejemplo como:

seleccionar * de NEWTABLE donde [nombre] en (seleccione el nombre desde oldtable)

0

nombre como nombre? bueno, no puedes hacer un LIKE e IN al mismo tiempo.

Esto parece un buen candidato para SOUNDEX

No JOIN con una SOUNDEX.

leer hasta aquí: http://msdn.microsoft.com/en-us/library/aa259235%28SQL.80%29.aspx

+0

+1, basado en la falta de información en la pregunta, esta es la única respuesta que podría funcionar –

6

Suponiendo que las dos tablas se relacionan de alguna manera.

SELECT newTable.* FROM newTABLE JOIN oldTable ON <JOIN CRITERIA> 
WHERE newTable.[Name] LIKE oldTable.name 
+1

sin usar un comodín, funcionará igual que = –

+0

En mi opinión, esta es la única solución que debe usar. – ChaosPandion

0

Nos encontramos con el mismo problema. Puede que no funcione para usted, pero la solución que se nos ocurrió es: SELECT [Fields]
FROM [Table]
WHERE [Field] like 'Condition1'
OR [Field] like 'Condition2'

No es una gran solución, pero nos funciona.

2

No es tan bonito, pero funciona:

SELECT DISTINCT * NEWTABLE
DE NEWTABLE
JOIN oldtable
EN NEWTABLE "Nombre" COMO oldTable.name

5
DECLARE @nt TABLE (NAME VARCHAR(10)) 
DECLARE @ot TABLE (NAME VARCHAR(10)) 

INSERT INTO @nt VALUES('Stuart') 
INSERT INTO @nt VALUES('Ray') 


INSERT INTO @ot VALUES('St%') 
INSERT INTO @ot VALUES('Stu%') 


SELECT * 
FROM @nt n 
WHERE EXISTS (SELECT * 
       FROM @ot o 
       WHERE n.name LIKE o.name) 
+1

+1 A diferencia de las respuestas de combinación, esto solo arrojará un registro, aunque podría usar una combinación y usar una selección distinta, dependiendo de cuál terminó mejor. – Yishai

+0

¿realmente crees que el OP está almacenando un "%" en oldTable.name ?? como en su ejemplo –

+1

No. No tengo idea de cómo el OP está almacenando sus datos, pero pidió "cualquier ayuda". Al menos mi código de muestra proporcionó algunos datos de muestra para trabajar. :) –

1

Gracias a todos.. . Utilicé la siguiente consulta, inspirada en la respuesta de LukLed y en un comentario de Stuart Ainsworth.

SELECT DISTINCT old.code, old.name, new.name, new.code 
FROM newTable new 
JOIN oldTable old 
ON new.name LIKE '%' + old.name + '%' 
WHERE new.code <> old.code 
ORDER BY old.name, new.name 

El rendimiento no es tan bueno, pero es un análisis de una sola vez y hace el trabajo.

La razón por la que elegí esto sobre la versión "EXISTE" es porque me da los resultados de las tablas nuevas y antiguas.

+0

probablemente pueda deshacerse de DISTINCT; no le está comprando mucho ya que muestra las columnas antiguas y nuevas. DISTINCT estaba allí en caso de que las columnas nuevas tuvieran coincidencias múltiples en columnas antiguas; en este caso, si lo hacen, usted todavía los está mostrando :) –

0

Si utiliza muy raramente cross apply, puede hacerlo con facilidad.
(temp declaración de tabla robada código de Stuart)

2 mesas no necesita tener ninguna relación como Matthews' answer.

DECLARE @nt TABLE (NAME VARCHAR(10)) 
DECLARE @ot TABLE (NAME VARCHAR(10)) 

INSERT INTO @nt VALUES('Stuart') 
INSERT INTO @nt VALUES('Ray') 


INSERT INTO @ot VALUES('St%') 
INSERT INTO @ot VALUES('Stu%') 

select distinct n.NAME 
from @nt n 
    cross apply @ot o 
where n.NAME like o.name 
+0

¿Por qué aplicar cross versus cross join? La combinación cruzada estará disponible en versiones anteriores de SQL Server, así como en otros RDBMS. Pero tal vez hay una sutileza que me estoy perdiendo. –

0

Un simple puñalada en la oscuridad, pero esto es muy reminiscencia de una situación en la que los datos no escalares. Ejemplo rápido usando el formato csv (SQL Server 2005 y superior):

WITH oldTable ([name]) 
    AS 
    (
     SELECT '003,006,009,012,015' 
     UNION ALL 
     SELECT '005,015' 
    ), 
    newTable ([name]) 
    AS 
    (
     SELECT '007' 
     UNION ALL 
     SELECT '009' 
     UNION ALL 
     SELECT '015' 
    ) 
SELECT N1.[name] 
    FROM newTable AS N1 
WHERE EXISTS (
       SELECT * 
       FROM oldTable AS O1 
       WHERE ',' + O1.[name] + ',' 
         LIKE '%,' + N1.[name] + ',%' 
      ); 
Cuestiones relacionadas