2009-10-12 10 views
5

muszę napisać poprawny T-SQL w wersji zapytania o następującej pseudo-kod:Jak napisać zapytanie T-SQL, aby zrobić "jak w"?

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

nie jestem pewien, jak go o to. Każda pomoc (nawet kierowanie mnie do istniejącego pytania) byłaby świetna. Dzięki!

Edytuj: Za kilka komentarzy wyjaśnię tę konkretną sprawę. Tabele wyglądać tak:

oldTable 
code varchar(10) 
name varchar(500) 

newTable 
code varchar(10) 
name varchar(500) 

We wszystkich przypadkach, w których oldTable.code <> newTable.code, ja chcąc sprawdzić, czy oldTable.name jest jak jeden z tych nazwisk w newTable.name. Zasadniczo niektóre nowe nazwy mają dodane kwalifikatory na początku lub końcu nazw. tj. "stara nazwa" może mieć "kwalifikowaną starą nazwę" w nowej tabeli. Dzięki jeszcze raz.

+0

Co powiesz na kilka przykładów nowych i starych nazw, które są "podobne", a niektóre "nie są podobne" do siebie nawzajem? –

+0

czy możesz podać przykładowe dane; masz poniżej kilka rozwiązań, które mogą działać, ale wiele zależy od sposobu przechowywania danych. –

+1

@Aaron Palmer, musisz podać rzeczywiste przykłady starych imion i nazwisk oraz czy są one "podobne" do siebie nawzajem. czy stary "bbb" pasuje do nowego "xbbb"? czy stary "xyz" odpowiada "abc"? czy stary "abcxyz" pasuje do "abc" itp., jeśli nie chcesz podawać przykładów, podaj zasady wyszukiwania dopasowań. –

Odpowiedz

1

Chyba po prostu trzeba usunąć jak np

select * from newTable gdzie [nazwa] w (wybierz nazwę z oldTable)

6

Zakładając dwie tabele odnoszą się w jakiś sposób.

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

bez użycia symbolu wieloznacznego, będzie działać tak samo jak = –

+0

Moim zdaniem jest to jedyne rozwiązanie, z którego należy skorzystać. – ChaosPandion

0

Sami wpadliśmy na ten sam problem. To może nie działać dla ciebie, ale rozwiązanie, które wymyśliliśmy, to: SELECT [Fields]
FROM [Table]
WHERE [Field] like 'Condition1'
OR [Field] like 'Condition2'

Nie jest to świetne rozwiązanie, ale działa dla nas.

2

Nie tak bardzo, ale to działa:

SELECT DISTINCT newTable *
OD newTABLE
DOŁĄCZ oldTable
NA newTable "Nazwa" jak 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 W przeciwieństwie do odpowiedzi sprzężenia, to zwróci tylko jeden rekord, chociaż można użyć sprzężenia i użyć wyboru odrębnego, w zależności od tego, który z nich zakończył się lepiej. – Yishai

+0

czy naprawdę myślisz, że OP zapisuje "%" w oldTable.name ?? jak w twoim przykładzie –

+1

Nie. Nie mam pojęcia, jak OP zapisuje jego dane, ale poprosił o "wszelką pomoc". Przynajmniej mój przykładowy kod dostarczył kilka przykładowych danych do pracy. :) –

1

Dzięki wszystkim.. . Użyłem następującego zapytania, zainspirowanego zarówno odpowiedzią LukLeda, jak i komentarzem Stuarta Ainswortha.

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 

Wydajność nie jest świetna, ale jest to jednorazowa analiza i wykonuje zadanie.

Powodem, dla którego wybrałem to w wersji "EXISTS" jest to, że daje mi oba wyniki z nowych i starych tabel.

+0

prawdopodobnie możesz pozbyć się DISTINCT; nie kupuje cię zbyt wiele, ponieważ wyświetlasz zarówno stare, jak i nowe kolumny. DISTINCT był tam w przypadku, gdy nowe kolumny miały wiele dopasowań na starych kolumnach; w takim przypadku, jeśli to robisz, nadal je wyświetlasz :) –

0

Jeśli używasz bardzo rzadko używanych cross apply możesz to zrobić z łatwością.
(temp deklaracja stół skradziony kod z Stuart)

2 stoły nie muszą mieć żadnego związku jako 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

Dlaczego warto zastosować krzyż w połączeniu krzyżowym? Łączenie krzyżowe będzie dostępne w starszych wersjach programu SQL Server, a także w innych pakietach RDBMS. Ale może istnieje subtelność, której mi brakuje. –

0

Zwykłe uderzenie w ciemność, ale to bardzo przypomina sytuację z danymi nieskalarnymi. Szybki przykład użycia formatu csv (SQL Server 2005 i nowsze wersje):

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] + ',%' 
      ); 
Powiązane problemy