Как объединить две таблицы SQL Server, у которых нет общего столбца

#sql #sql-server #tsql

Вопрос:

У меня есть две таблицы в SQL Server, и мне нужны мои выходные данные, как показано ниже.

Таблица 1:

nParaID cParaNo cParaYear cParaCD
219 1 2021 ВТМК
220 1 2021 SFCC

Таблица 2:

cFtyCD сИнвНо
ВТМ VTM0001/S/20
SFC SFC001/30

Конечный результат должен быть ,

nParaID cParaNo cParaYear cParaCD cFtyCD сИнвНо
219 1 2021 ВТМК ВТМ VTM0001/S/20
220 1 2021 SFCC SFC SFC001/30

Может кто-нибудь, пожалуйста, сказать мне, как получить окончательный результат?

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

1. Итак, как вы знаете , как объединить nParaId=219 деталь с cFtyCD=VTM деталью в таблице № 2 ?? Почему это должно быть так — не может ли это быть объединено со второй строкой в таблице № 2?? Также: что определяет порядок этих строк в этих двух таблицах, если вы хотите объединить «первый» из обеих таблиц, а затем «второй» — каковы критерии упорядочения (учитывая, что таблицы реляционной базы данных по своей сути являются неупорядоченными наборами данных)?

2. Мне нужно , чтобы получить cParaCD=cFtyCD и объединить эти две таблицы.

3. В вашем примере у вас никогда не было cParaCD=cFtyCD (cParaCD заканчивается на D)

Ответ №1:

Итак , ваш столбец cParaCD из таблицы 1 содержит первые 3 символа, равные вашему столбцу cFtyCD из таблицы 2. Если этот критерий (что видно из примеров данных, которыми вы поделились для обеих таблиц) остается одинаковым для всех ваших строк в первой и второй таблицах, то можно использовать приведенный ниже запрос.

Я, по сути, вынимаю первые 3 символа из cParaCD, а затем приравниваю их к значению в столбце cFtyCD.

 Select
nParaID ,  cParaNo    ,cParaYear    ,cParaCD    ,cFtyCD    ,cInvNo
from Table1 a 
join Table2 b on substring(a.cParaCD,1,len(b.cFtyCD)) = b.cFtyCD
 

Ответ №2:

Что я узнал из приведенного выше примера, так это то, что обе таблицы имеют одинаковое количество строк, и их необходимо соединить боковыми путями без какого-либо общего ключа соединения. Для этого создайте временный столбец с общим ключом соединения, а затем примените соединение. Ключ соединения создается с использованием номера строки с порядком в литерале.

 SELECT * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS join_key, t.* FROM your_table1 t) AS t1
INNER JOIN
(SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS join_key, t.* FROM your_table2 t) AS t2
ON t1.join_key = t2.join_key
 

PS: Это просто из любопытства. Совсем не рекомендуется присоединяться к таблицам SQL подобным образом без какого-либо надлежащего ключа соединения.

Ответ №3:

Похоже, что наиболее распространенным столбцом является cParaCD таблицы 1 и cFtyCD таблицы 2. Вы можете использовать «нравится» во внутреннем соединении вместо»=».

 select * from table1 t1 inner join table2 t2
on t1.cParaCD like CONCAT('%',t2.cFtyCD, '%');
 

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

1. Требования неясны, поэтому нет причин использовать ведущий подстановочный знак, который нельзя использовать.