2016-04-12 1 views
0

У меня есть 3 таблицы с нижним форматом.отображение данных из 3 таблиц с условным соединением

Table A     Table B     Table C 
id       id1 id2     id name 
1       1 null     1.1 john 
2       1 1.1     
          2 null     

С запросом

select a.id,b.id1,b.id2,c.id,c.name 
from TableA a 
join TableB b on a.id = b.id1 
left join TableC on b.id2 = c.id 

я увидеть ниже данные

a.id b.id1 b.id2 c.id c.name 
1  1  null null null 
1  1  1.1 1.1 john 
2  2  null null null 

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

Пожалуйста, дайте мне знать, если вам нужна ясность.

+1

Что происходит, если имеется несколько ненулевых значений? Это возможно? –

+0

Да, есть возможность иметь несколько ненулевых значений. В этом случае мне нужно отобразить все ненулевые значения. см. Нижеприведенный пример. Таблица A Таблица B Таблица С ID Имя ID1 ID2 ID 1 1 нуль 1.1 Джон 2 1 1,1 1,2 Герри 1 1.2 2 нуль Тогда мой результат должен быть: 1 1.1 Джон 1 1.2 Герри 2 null null – Naresh

ответ

0

Мы можем иметь решение, используя другую таблицу, которая хранение, если есть по крайней мере, не нулевое значение на id2 для id1 в Tableb, и если да, удаляет когда есть нулевые значения.

Эта таблица будет:

select sum(case when id2 is null then 0 else 1 end) as test, 
id1 
from TableB 
group by id1 

И запрос:

select a.id,b.id1,b.id2,c.id,c.name 
from TableA a 
join TableB b on a.id = b.id1 
left join TableC on b.id2 = c.id 
left join (
select sum(case when id2 is null then 0 else 1 end) as test, 
id1 
from TableB 
group by id1 
) AS Table_test on Table_test.id1 = b.id1 

where b.id2 is not null or Table_test.test = 0 

Таким образом, в тех случаях, когда у вас есть несколько строк, вы будете иметь все ваши id2 в одной строке, и нет null, и только в нулевых случаях вы сохраните нулевую строку.

+0

Выполняет тот же запрос в oracle sql developer. Но становится ниже ошибки. Пожалуйста помоги. ORA-00905: отсутствует ключевое слово 00905.00000 - «отсутствует ключевое слово» * Причина: * Действие: Ошибка в строке: 10 Столбец: 11 – Naresh

+0

Ничего. Он работает сейчас, но у меня есть еще одна проблема: если я хочу запустить запрос только для определенного идентификатора. Например, если я хочу видеть имена только для id 1. i.e, TableA.id = '1'. Пожалуйста, предложите. Поскольку я новичок в Oracle, я не знаю, где добавить фильтр. – Naresh

+0

Просто измените предложение 'WHERE' следующим образом: ' WHERE (b.id2 не равно null или Table_test.test = 0) и a.id = 1' Вы все понимаете в этом запросе? Если вы новичок в oracle, этот запрос может быть более понятным, чем предлагаемый один из предложенных @sgeddes, но оба они работают. И, пожалуйста, подтвердите ответ, если он работает :) – BD01

2

Если я правильно понять, вот один вариант с использованием rank:

select * 
from (
    select a.id,b.id1,b.id2,c.id,c.name, 
     rank() over (partition by b.id1 
         order by case when b.id2 is null then 1 else 0 end) rnk 
    from TableA a 
     join TableB b on a.id = b.id1 
     left join TableC on b.id2 = c.id 
) t 
where id2 is not null or rnk = 1 
0

Ваши дублирует все поступающие из TableB. Вы можете выделить эти строки несколькими способами. Я думаю, что самый простой способ для ваших данных агрегация:

select a.id, b.id1, b.id2, c.id, c.name 
from TableA a join 
    (select b.id1, max(b.id2) as id2 
     from TableB b 
     group by b.id1 
    ) b 
    on a.id = b.id1 left join 
    TableC 
    on b.id2 = c.id; 
+1

Я бы предположил, что это предполагает, что OP хочет вернуть только одну запись из 'tableb'. Я предположил, что в 'tableb' могут быть возвращены несколько ненулевых записей. – sgeddes

+0

@sgeddes. , , Вопрос в этом вопросе довольно неоднозначен, и эта версия работает над образцовыми данными. ОП должен предоставить больше объяснений. –

+0

Если в таблице B имеется несколько записей для одного идентификатора, тогда нам нужно отобразить все эти ненулевые значения. – Naresh

Смежные вопросы