Как я могу написать запрос T-SQL, чтобы сделать «как в»? - PullRequest
5 голосов
/ 12 октября 2009

Мне нужно написать действительную версию запроса T-SQL следующего псевдокода:

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

Я не уверен, как это сделать. Любая помощь (даже направившая меня на существующий вопрос) была бы великолепна. Спасибо!

Edit: По некоторым комментариям я проясню этот конкретный случай. Таблицы выглядят так:

oldTable
code varchar(10)
name varchar(500)

newTable
code varchar(10)
name varchar(500)

Во всех случаях, когда oldTable.code <> newTable.code, я хочу посмотреть, похоже ли oldTable.name на одно из имен в newTable.name. В основном, к некоторым новым именам добавлены квалификаторы в начале или конце имен. то есть: «старое имя» может иметь «квалифицированное старое имя» в newTable. Еще раз спасибо.

Ответы [ 9 ]

6 голосов
/ 12 октября 2009

Предполагая, что две таблицы каким-то образом связаны.

SELECT newTable.* FROM newTABLE JOIN oldTable ON <JOIN CRITERIA>
WHERE newTable.[Name] LIKE oldTable.name
5 голосов
/ 12 октября 2009
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)
2 голосов
/ 12 октября 2009

Не очень красиво, но работает:

ВЫБЕРИТЕ DISTINCT newTable. *
FROM newTABLE
ПРИСОЕДИНИТЬСЯ к oldTable
ON newTable. "Name" LIKE oldTable.name

1 голос
/ 13 октября 2009

Спасибо всем. Я использовал следующий запрос, вдохновленный ответом LukLed и комментарием Стюарта Эйнсворта.

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

Производительность не так уж велика, но это однократный анализ, и он выполняет свою работу.

Причина, по которой я выбрал эту версию вместо версии "EXISTS", заключается в том, что она дает мне результаты как для новой, так и для старой таблиц.

1 голос
/ 12 октября 2009

Я думаю, вам просто нужно удалить, например:

выберите * из новой таблицы, где [имя] в (выберите имя из старой таблицы)

0 голосов
/ 13 октября 2009

Простой удар в темноте, но это ужасно напоминает ситуацию, связанную с нескалярными данными. Быстрый пример использования формата CSV (SQL Server 2005 и выше):

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] + ',%' 
              );
0 голосов
/ 13 октября 2009

Если вы используете очень редко используемый cross apply, вы можете сделать это легко.
(объявление временной таблицы украденного кода у Stuart )

2 таблицы не должны иметь никаких связей, как Ответ Мэтьюса .

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 голосов
/ 12 октября 2009

Мы столкнулись с той же проблемой сами. Это может не сработать для вас, но решение, которое мы придумали, это: SELECT [Fields]<br> FROM [Table]<br> WHERE [Field] like 'Condition1'<br> OR [Field] like 'Condition2'<br>

Не очень хорошее решение, но оно работает для нас.

0 голосов
/ 12 октября 2009

Имя как Имя? ну, вы не можете делать LIKE и IN одновременно.

Это выглядит как хороший кандидат на SOUNDEX

Присоединяйтесь к SOUNDEX.

читайте здесь: http://msdn.microsoft.com/en-us/library/aa259235%28SQL.80%29.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...