#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. Требования неясны, поэтому нет причин использовать ведущий подстановочный знак, который нельзя использовать.