SQL: присоединяется, я пробовал перекрестное соединение, но оно не работает - PullRequest
1 голос
/ 08 февраля 2020

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

У меня есть таблица, как показано ниже:

Field1 Field2 Field3 Field4  
1       AB    A123   Electric  
1       AB    B123   Maths  
1       CD    XY1    Science  
1       CD    CYZ    Social  
1       SQ    NA     NA  

Вывод должен быть таким:

Field1 Field2 Field3 Field4
1       AB    A123   Electric  
1       CD    NA     Electric  
1       AB    B123   Maths  
1       CD    NA     Maths  
1       CD    XY1    Science  
1       AB    NA     Science  
1       CD    CYZ    Social  
1       AB    NA     Social  
1       SQ    NA     Electric  
1       SQ    NA     Math  
1       SQ    NA     Science   
1       SQ    NA     Social  

Здесь Field1 имеет общее значение, основанное на значениях Field2 и Field 4, нам нужно проверить, есть ли в Field2 и Field4 запись в других Field2, таких как AB и Electric, имеет ли он запись для Field2 Я имею в виду для CD и SQ то же самое Field4, если нет, то создайте запись. Это как если бы у нас были все уникальные значения в field4, а затем в каждой записи должны присутствовать все значения в Field2. если его нет, то следует указать, не существует или нет.

SQ не имеет записей, поэтому необходимо создать четыре строки. Добрый совет.

Ответы [ 2 ]

3 голосов
/ 08 февраля 2020

В этом примере у вас есть таблица с именем a

with cte as (
    select Field2 as f
    from a
    union all
    select Field4 as f
    from a    
)
select distinct 1 Field1
       , ct1.f Field2
       , case when (ct1.f, a.Field3, ct2.f) in (select distinct Field2, Field3, Field4
                                                from a) 
              then a.Field3
              else 'NA'
         end Field3
       , ct2.f Field4
    from cte ct1 
        cross join cte ct2
    on ct1.f <> ct2.f
    left join a 
    on ct1.f = a.Field2
    and ct2.f = a.Field4
where ct1.f in (select Field2 from a)     
and ct2.f in (select Field4 from a where Field4 <> 'NA')

ЗДЕСЬ ДЕМО

2 голосов
/ 08 февраля 2020

Соедините различные значения field2 и field4, а слева соедините таблицу:

select 
  f2.field1, 
  f2.field2,
  coalesce(t.field3, 'NA') field3,
  f4.field4
from (select distinct field1, field2 from tablename) f2
inner join (select distinct field1, field4 from tablename where field4 <> 'NA') f4
on f4.field1 = f2.field1
left join tablename t
on t.field1 = f2.field1 and t.field2 = f2.field2 and t.field4 = f4.field4
order by f2.field1, f2.field2

См. demo . Результаты:

| field1 | field2 | field3 | field4   |
| ------ | ------ | ------ | -------- |
| 1      | AB     | NA     | Science  |
| 1      | AB     | NA     | Social   |
| 1      | AB     | A123   | Electric |
| 1      | AB     | B123   | Maths    |
| 1      | CD     | XY1    | Science  |
| 1      | CD     | CYZ    | Social   |
| 1      | CD     | NA     | Electric |
| 1      | CD     | NA     | Maths    |
| 1      | SQ     | NA     | Electric |
| 1      | SQ     | NA     | Maths    |
| 1      | SQ     | NA     | Science  |
| 1      | SQ     | NA     | Social   |
...