Member 14085040 Ответов: 1

Как объединить две таблицы с общим словом в SQL server


У меня есть две таблицы со следующими данными:

              Table A                              Table B
ID | Text                        | Barnr.      Barnr. | Text
1  | Dan-salg 04.11              | 0             1001 | GOOGLE*GS
2  | Gebyr udland                | 0             1002 | Overforsel
3  | Buy EUR 10,00 GOOGLE*GS     | 0             1003 | Geby udlandet 
4  | Pbs overforsel FAKT         | 0             1004 | Dan-salg

Я пробовал использовать следующий код, но он, похоже, не работает ни для одной строки.

select OpgaveD.Id AS Bilag, OpgaveD.Dato, OpgaveD.Tekst, kd.Konto, OpgaveD.Modkonto, OpgaveD.Debet, OpgaveD.Kredit 
from OpgaveD left join KoKlDetail kd on kd.Navn LIKE CONCAT('%', SUBSTRING(OpgaveD.Tekst,1,(CHARINDEX(' ',OpgaveD.Tekst + ' ')-1)), '%') where OpgaveD.OpgaveId = 1


Я получаю следующее:

ID | Text                        | Barnr.      
1  | Dan-salg 04.11              | 1004            
2  | Gebyr udland                | 1003             
3  | Buy EUR 10,00 GOOGLE*GS     | NULL             
4  | Pbs overforsel FAKT         | NULL

Мой вопрос таков: как я могу увидеть лучший код, который будет читать общий слово в каждой таблице возвращать также 1001 и 1002 вместо NULL?

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

select OpgaveD.Id AS Bilag, OpgaveD.Dato, OpgaveD.Tekst, kd.Konto, OpgaveD.Modkonto, OpgaveD.Debet, OpgaveD.Kredit 
from OpgaveD left join KoKlDetail kd on kd.Navn LIKE CONCAT('%', SUBSTRING(OpgaveD.Tekst,1,(CHARINDEX(' ',OpgaveD.Tekst + ' ')-1)), '%') where OpgaveD.OpgaveId = 1

1 Ответов

Рейтинг:
10

Maciej Los

Самый простой и легкий способ - это использовать Функция patindex[^] функция. Видеть:

DECLARE @tablea TABLE(ID int, [Text] VARCHAR(250))
DECLARE @tableb TABLE(ID int, [Text] VARCHAR(250))

INSERT INTO @tablea(ID, [Text])
VALUES(1, 'Dan-salg 04.11'),
(2, 'Gebyr udland'),
(3, 'Buy EUR 10,00 GOOGLE*GS'),
(4, 'Pbs overforsel FAKT')

INSERT INTO @tableb(ID, [Text])
VALUES(1001, 'GOOGLE*GS'),
(1002, 'Overforsel'),
(1003, 'Geby udlandet'),
(1004, 'Dan-salg')

SELECT ta.ID, ta.[Text], tb.ID ID2, tb.[Text] Text2
FROM @tablea ta LEFT JOIN @tableb tb ON PATINDEX('%' + tb.Text + '%', ta.Text) >0


Результат:
ID	Text					ID2		Text2
1	Dan-salg 04.11			1004	Dan-salg
2	Gebyr udland			NULL	NULL
3	Buy EUR 10,00 GOOGLE*GS	1001	GOOGLE*GS
4	Pbs overforsel FAKT		1002	Overforsel


Удачи вам!


CPallini

5.

Maciej Los

Спасибо, Карло.

MadMyche

+5

Maciej Los

Спасибо.

Member 14085040

Большое спасибо Мацей за вашу помощь. Пока что это кажется супер.
+5

Maciej Los

Всегда пожалуйста.
Спасибо.

Member 14085040

Я также использовал треску в другой таблице, но я получил результат:

DECLARE @tablea TABLE(ID int, [Text] VARCHAR(250))
DECLARE @tableb TABLE(ID int, [Text] VARCHAR(250))

Вставить в @tablea(ID, [текст])
Значения(1, 'Gebyr, overf.'),
(2, 'Bgs Skat rykker'),
(3, "Купить, EUR 10,00 GOOGLE*GS"),
(4, "Pbs overforsel FAKT")

Вставить в @tableb(ID, [текст])
ЗНАЧЕНИЯ(1001, 'GOOGLE*GS'),
(1002, "Оверфорсел"),
(1003, 'Ls, kreditor 20222 SKAT'),
(1004, "гебыр удланд")

Выберите ta.Идентификатор та.[Текст], ТБ.Идентификатор ID2, которое, ТБ.[Текст] Текст2
Из таблицы tablea та левое соединение @таблицы tableb ТБ на функция patindex('%' + ТБ.Текст + '%', та.Текст) и gt;0

Member 14085040

Результат:
Идентификатор ID2, которое текст Текст2
1 Гебыр оверф. НУЛЬ НУЛЬ
2 Bgs Skat rykker NULL NULL
3 Купить, EUR 10,00 GOOGLE*GS 1001 GOOGLE*GS
4 Pbs overforsel FAKT 1002 Overforsel

Member 14085040

Мне не хватает здесь того, что мне нужно использовать общее слово (Gebyr и skat ) между таблицами a и b.
Есть ли какое-то решение для этого?

Maciej Los

Да, это так.
Вам нужно использовать CTE, чтобы разделить sentece на слова, а затем найти каждое слово в другой записи.
Это менее эффективно.

Member 14085040

Спасибо тебе за это.