#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 для сопоставления строк, используя один из методов, описанных в ссылке ниже: