Samira Radwan Ответов: 1

Внутреннее соединение с подобным


Привет,
У меня есть 2 таблицы транспортных средств, такие как (Год выпуска/марка/модель/отделка/двигатель/трансмиссия).
пытаюсь соединить 2 таблицы с помощью inner join on year/make/model/transmission, но цилиндр на самом деле не равен. В tb1 цилиндре будет что-то вроде (8cyl. / 4cyl.), в tb2 цилиндре будет часть значения поля что-то вроде (coupe 4cyl. manaul).
Я пытался использовать LIKE, но это не работает, хотя цилиндр в tb1 является частью поля цилиндра tb2.

У меня есть 2 вопроса:
1-Как использовать Like with inner join, чтобы получить все строки с одинаковым номером цилиндра (что я уже пробовал!)
2-Можно ли обрезать поле в tb2, чтобы получить только цилиндр № so (coupe 4cyl. manaul) будет просто (4cyl).
Редактировать: использование SQL server 2008 R2

спасибо,
Самира

Что я уже пробовал:

Вот что я попытался внутренне соединить 2 таблицы, которые идеально работают без цилиндра:
Select table1.* tb1
inner join table2 tb2
on tb1.year=tb2.year
and tb1.make=tb2.make
and tb1.model=tb2.model 
and tb1.transmission=tb2.transmission
and (tb1.EngineCylinder like '%' + tb2.EngineCyliner + '%') --or use where 
-- also tried: and tb1.EngineCylinder in (select EngineCylinder from tb2)

Herman<T>.Instance

установите последнее и в предложение WHERE

Samira Radwan

Спасибо! Я уже пробовал, где это делает решение @Homero Rivera.

1 Ответов

Рейтинг:
4

Homero Rivera

Если я правильно понял, то двигатель в tb2 более сложен, чем в tb1.
LIKE проверит, содержит ли первая строка вторую.

Если вы переключитесь с вашего текущего выражения на

... and (tb2.EngineCyliner LIKE '%' + tb1.EngineCylinder + '%')

Это должно сработать.
Или вы также можете использовать patindex, который дает вам начальную позицию текстового шаблона внутри другого
... and PATINDEX('%' + tb1.EngineCylinder + '%', tb2.EngineCyliner) >= 1


РЕДАКТИРОВАТЬ
Из моих последних исследований в MS SQL Server; хотя это работает, неудобно использовать предикат с like или функцией в предложении JOIN или WHERE, потому что компонент database engine не может извлечь выгоду из индексов и должен будет выполнять эту операцию для каждой строки в таблице... Очень плохо для огромных таблиц, и очень плохо, если это производственная среда, такая как сотни пользователей в секунду. MS SQL Server действительно имеет функции, помогающие этому виду поиска, например полнотекстовый поиск (google for it).


Samira Radwan

большое спасибо! PATINDEX делает это