Вы не указали, какой SQL-движок вы используете - это может иметь значение.
Я предоставил решение, требующее поддержки функции row_number(). Я считаю, что по крайней мере Oracle, DB2 и SQLServer поддерживают строку row_number().
Проблема довольно прямолинейная, как только отдельные значения из одной таблицы поворачиваются в одну строку. Не может быть никаких совпадений, если в таблице 1 существует более 4 различных значений. Кажется, должен быть лучший способ сделать поворот, но я знаю, что это решение работает.
Я приложил все усилия, чтобы убедиться, что ответ возвращает все строки из двух, если один пуст, а дублированные строки в одном игнорируются.
with
uniqueOne as (
select distinct col1 from one
),
ranked as (
select col1, row_number() over (order by col1) seq from uniqueOne
),
vals as (
select t1.col1 val1,
t2.col1 val2,
t3.col1 val3,
t4.col1 val4
from (select 1 dummy) dummy
left join ranked t1 on t1.seq=1
left join ranked t2 on t2.seq=2
left join ranked t3 on t3.seq=3
left join ranked t4 on t4.seq=4
left join ranked t5 on t5.seq=5
where t5.seq is null
)
select two.*
from two
cross join vals
where (vals.val1 is null or vals.val1 in (two.col1, two.col2, two.col3, two.col4))
and (vals.val2 is null or vals.val2 in (two.col1, two.col2, two.col3, two.col4))
and (vals.val3 is null or vals.val3 in (two.col1, two.col2, two.col3, two.col4))
and (vals.val4 is null or vals.val4 in (two.col1, two.col2, two.col3, two.col4))
;
Вот live demo of the solution
Боже мой, я думаю, я должен прочитать свой ответ и сделать некоторые исследования чаще. SQLServer имеет оператор Pivot, который делает решение очень эффективным. Oracle также имеет Pivot, но использует другой синтаксис.
Адрес working demo of the SQLServer Pivot solution. Взгляните на план сладкого исполнения.
А вот SQLServer запрос:
with
uniqueOne as (
select distinct col1 from one
),
ranked as (
select col1, row_number() over (order by col1) seq from uniqueOne
),
vals as (
select [1] val1, [2] val2, [3] val3, [4] val4, [5] val5
from ranked
pivot (min(col1) for seq in ([1],[2],[3],[4],[5])) PivotTable
)
select two.*
from two
join vals on val5 is null
where (vals.val1 is null or vals.val1 in (two.col1, two.col2, two.col3, two.col4))
and (vals.val2 is null or vals.val2 in (two.col1, two.col2, two.col3, two.col4))
and (vals.val3 is null or vals.val3 in (two.col1, two.col2, two.col3, two.col4))
and (vals.val4 is null or vals.val4 in (two.col1, two.col2, two.col3, two.col4))
;
Запись в таблице 2 должна соответствовать каждой записи в таблице 1 для хотя бы одного из ее столбцов? – rkpasia
Да, как показано на примере. –
@ KaranJ.S. , , , Какую базу данных вы используете? –