2016-11-05 2 views
-3

SampleВыберите отношение между двумя столбцами в SQL

Я хочу, чтобы выбрать Data3 на Column2 значений отношений.
Column2.Data3 отношение с Column1.Data2_005.
Column1.Data2_005 содержит Column2.Data2.
Column1.Data1_001 содержит Column2.Data1.
Если column1 не содержит column2 конец цикла.

И вот мой выход.
enter image description here

+3

Просьба пояснить должным образом. вопрос до сих пор не ясен –

+0

@vivek nuna. Я хочу, каковы отношения avilable по данным на основе столбца2. –

ответ

0

Вы, кажется, хотите выглядеть рекурсивно в таблице для Column2 значений, содержащихся в предыдущем Column1 значения. Вы можете сделать это, используя общее табличное выражение;

WITH cte(Column1, Column2) AS (
    SELECT Column1, Column2 FROM test t WHERE Column2='Data3' 
    UNION ALL 
    SELECT t.Column1, t.Column2 FROM test t 
    JOIN cte 
    ON CHARINDEX(t.column2, cte.Column1) > 0 
) 
SELECT * FROM cte; 

>>> 

Column1  Column2 
Data2_005 Data3 
Data1_001 Data2 
GML1  Data1 

Первый выбор находит базовый случай (строку с Column2 равным Data3).

Второй выбор соединяется с самим cte, который в этом случае содержит предыдущую строку, чтобы вы могли сопоставить предыдущее значение Column1, чтобы найти следующую строку.

Остерегайтесь петель (например, строку с Data3_001 + Data3 потерпит неудачу запрос)

+0

Спасибо большое, и он отлично работает, но я получил ошибку рекурсии по этому запросу. «Утверждение прекращено. Максимальная рекурсия 100 исчерпана до завершения заявки». –

0

другой аромат:

create table #temp (column1 nvarchar(20), column2 nvarchar(20)) 
insert into #temp values 
('GML1', 'Data1'), 
('Data1_001', 'Data2'), 
('Data2_005', 'Data3'), 
('GML2', 'Data10'), 
('Data10_001', 'Data11'), 
('Data10_005', 'Data12') 


;with cte 
as 
(
select column1, column2 from #temp where column2='Data3' 
union all 
select a.column1, a.column2 from #temp a join cte b on a.column2 = SUBSTRING(b.column1, 0, Len(b.column2)+1) 
) 
select * from cte order by column2 
Смежные вопросы