частичное сопоставление строк в sql

#sql

#sql

Вопрос:

Мне нужно сопоставить два столбца из двух разных таблиц на основе общего количества строк, которые они имеют. так, например, в первом столбце у меня есть:

 ================Table 1==============================
ID     desc             Year      Month
123    food_drink       2016      8
345    shoe_bag         2016      8
678    001_toilet_paper 2015      7
910    Bags_of_thing    2015      6

======================table 2======================
ID      Name           Year        month
ad      drink_server   2016        8 
ac      shoe_shiny     2016        8
aa      white_paper    2015        7
cc      blue_bags      2015        6
  

Есть ли способ объединить две таблицы, объединив год, месяц и аналогичную строку в описании и имени. Итак, сравнивая столбец desc и name, чтобы увидеть, имеют ли они > = 5 общих строк, тогда:

 ===================================================
ID1  ID2  name          desc              Year  Month
123  ad   drink server  food_drink        2016   8
678  aa   white_paper   001_toilet_paper  2016   7
  

По сути, мне нужен способ сравнить количество общих строк между двумя столбцами разных таблиц. Спасибо.

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

1. вы можете написать все join , что хотите — предложения join просто сводятся к логическому true / false: true = объединение записей, false = no join . но совпадения ваших подстрок НЕ будут красивыми. sql не является хорошим языком для выполнения произвольных манипуляций со строками. вам было бы ГОРАЗДО лучше нормализовать таблицы и поместить эти ключевые слова food / drink / server / blah / blah в их собственную дочернюю таблицу, и тогда сопоставление будет тривиальным тестом join equality.

2. Я не уверен, понимаю ли я. Вы хотели бы сравнить каждую строку из table1 с каждой строкой из table2, чтобы проверить, есть ли у них в аренде (или точно) 5 общих полей, или вы хотите сравнить столбец со столбцом?

3. Какую СУБД вы используете?

4. microsoft server management studio

5. Привет. Боюсь, вопрос не ясен. Можете ли вы привести нам пример? Спасибо

Ответ №1:

Ваша проблема сводится к тому, что ваши данные даже не находятся в первой нормальной форме, что очень затрудняет работу с ними в SQL.

Это то, что я бы сделал:

  • Создайте временную таблицу, которая разбивает поля на слова. Я предполагаю, что идентификатор является ключом в обеих таблицах. Таблицы будут выглядеть следующим образом:

    ================ Табличные слова1==============================

     ID1     word
    123    food
    123    drink
    345    shoe
    345    bag
    ...
      

============= табличные слова2 ======================

     ID2      word
    ad      drink
    ad      server 
    ac      shoe
    ac      shiny
    ... 
  

Теперь вы можете легко найти идентификаторы, которые имеют 5 или более общих слов:

 SELECT ID1, ID2 FROM words1 JOIN words2 ON (word1.word = words2.word) 
GROUP by ID1, ID2
having count(*) >= 5;
  

Получив ID1 и ID2, вы можете вернуться к исходным таблицам и получить остальные нужные вам данные.

Ответ №2:

Спасибо всем, кто ответил. В итоге я использовал R для сопоставления строк, используя один из методов, описанных в ссылке ниже:

https://www.r-bloggers.com/fuzzy-string-matching-a-survival-skill-to-tackle-unstructured-information/