2016-09-09 2 views
0

У меня есть задача таблицылевое внешнее объединение имени столбца двусмысленно определено

select 
    sts_id, 
    count(*) mycount 
from 
    task 
where 
sts_id in (1, 8, 39) 
group by sts_id; 

выход:

sts_id count 
     1  1 
     8  1 
     39  1 

У меня есть еще один временную таблицу с одним столбцом sts_id , который выглядит как этот

 sts_id 
     1 
     8 
     39 
     40 
     41. 

Я пытаюсь левого соединения для обеих таблиц

select 
    in_list.sts_id, 
    count(*) mycount 
from 
    task 
left outer join 
    in_list 
    on task.sts_id = in_list.sts_id 
group by sts_id; 

получить аб о/р, как

1 1 
8 1 
39 1 
40 0 
41 0.. 

Я получаю сообщение об ошибке в столбце двусмысленно определена.

+0

Ошибка, возникающая из-за того, что группа должна иметь псевдоним таблицы, а также 'in_list.sts_ID' Однако для получения желаемых результатов вам необходимо ** сделайте, чтобы ваш левый присоединился к правильному соединению **, поскольку in_list имеет больше значений, чем задание ... на основе ваших образцов данных pro тизация. и 'coalesce (count (task.Sys_ID), 0) как myCount' в select. – xQbert

ответ

2

Вы используете left join неправильный путь (слева это должен быть стол со всеми строками, которые вы хотите показать). Count (task.sts_id) получить 0 по строкам без вхождений в этой таблице

select 
    in_list.sts_id, 
    count(task.sts_id) mycount 
from 
    in_list 
left outer join 
    task 
    on in_list.sts_id = task.sts_id 
AND task.sts_id in (1, 8, 39) -- Thanks Matt. 
group by in_list.sts_id; 
+0

Я пробовал, но я не получаю вывод по мере необходимости. –

+0

@SoomSatyam попробуй мой второй подход. Я изменил ваш счет (*) – vercelli

+0

@SoomSatyam Я вижу, у вас есть левое соединение в другую сторону. Попробуйте сейчас – vercelli

1

Вы пропускаете псевдоним таблицы в предложении GROUP BY. Однако необходимый результат говорит, что вы должны изменить ваш присоединиться к логике: исходная таблица должна быть in_list, в то время как task должны быть в левом внешнем соединении:

select ... 
from in_list 
    left outer join task 
-1

я получил ответ с этим запросом

select t2.sts_id, count(t.sts_id) 
from task t, in_list t2 
where t2.sts_id = t.sts_id(+) 
group by t2.sts_id 

Спасибо,

+1

, пожалуйста, пожалуйста, используйте явное соединение sytax соединения, особенно для соединений OUTER, поскольку в этом случае было лишено некоторых rdbms, таких как sql-server 2005 +. Я понимаю, что оракул отличается, но ..... http://stackoverflow.com/questions/44917/explicit-vs-implicit-sql-joins – Matt

1
select 
    in_list.sts_id, 
    coalesce(count(task.sts_ID),0) mycount --changed this line 
from 
    task 
right outer join       --changed this line 
    in_list 
    on task.sts_id = in_list.sts_id 
group by in_list.sts_id;     -- changed this line 

Причины:

  • в in_list содержит больше данных, чем задачи, нам необходимо либо изменить порядок таблицы или сделать его право присоединиться
  • Граф будет засчитываться все записи не возвращается resutls вы хотите счетчик от задачи
  • потребности для объединения результатов в противном случае нулевой счет будет возвращать нуль не 0.
Смежные вопросы