Сопоставление последних букв строки с первыми четырьмя буквами другой (сопоставление с шаблоном SQL)

#sql #substring #impala

#sql #подстрока #impala

Вопрос:

Итак, если у меня есть две таблицы:

 **Table_1:**

F_name |L_Name

GREGORY| WASHINGTON


**Table_2:**

 ID_Key | Group_number

 9233443GREG| 193556
  

Я хочу сопоставить последние цифры ID_Key таблицы 2 (GREG) с f_name таблицы 1 (GREGORY).

Итак, я хочу, чтобы выходные данные отображали все совпадения между последними 4 цифрами ID_Key и первыми четырьмя цифрами F_name.

Вот что я пробовал, но безрезультатно:

 select * from 
Table_2 where
Where LEFT(ID_key,4) IN (
Select Left(F_name,4) from table_1
Group By LEFT (ID_KEY,4)
Having Count(*) > 1 
)
  

Есть идеи?

Комментарии:

1. Вопрос, насколько велики таблицы и какую версию MySQL ( SELECT VERSION() ) вы используете?

2. Я удалил несовместимые теги базы данных. Пожалуйста, помечайте только ту базу данных, которую вы действительно используете.

Ответ №1:

Разве это не так просто?

 select *
from table_1
    inner join table_2 on left(table1.f_name, 4) = right(table_2.id_key, 4);
  

Комментарии:

1. операция объединения представляется наиболее простым способом удовлетворения спецификации, описанной в вопросе. 10

2. Оператор left не работает. Я использую impala. Будет ли это иметь значение?

3. Извините, я не знаю impala. Мой запрос работает не так, как ожидалось?

Ответ №2:

Мы могли бы использовать операцию объединения и поместить критерии соответствия в ON предложение примерно так:

 SELECT r.id_key
     , r.group_number
     , n.f_name
     , n.l_name
  FROM `Table_1` n
  JOIN `Table_2` r
    ON RIGHT(TRIM(r.id_key),4) = LEFT(n.f_name,4)
 ORDER
    BY r.id_key
     , r.group_number
     , n.f_name
  

Ответ №3:

используйте right во время вычитания ID_key для 2-й таблицы

 select * from 
Table_2 where
Where right(ID_key,4) IN (
Select Left(F_name,4) from table_1

)
  

нет необходимости в агрегировании, которое вы использовали в своем запросе

выходной сигнал

 ID_key        Group_number
 9233443GREG    193556
  

ДЕМОНСТРАЦИЯ

Ответ №4:

 SELECT *
FROM [Table1] AS [t1]
INNER JOIN [Table2] AS [t2]
    ON LEFT(t1.[F_Name],4) = RIGHT(t2.[ID_key],4);
  

Ответ №5:

Вы можете использовать EXISTS:

 select * from Table_2 t2
where exists (
  select 1 from Table_1 
  where left(F_name, 4) = right(t2.ID_Key, 4)
)