Oracle 12 SQL - ORA-00933, ORA-0923, ORA-00979 Что я делаю не так? - PullRequest
0 голосов
/ 06 июля 2018

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

Таблица A. Ток такой же, как B.id

Тем не менее, информация, которую я хочу получить - это общее количество совпадений в таблице A с текущими данными и отображением информации B.name вместо b.id

Я пробовал много вещей, и до сих пор у меня возникает проблема, из-за которой говорится, что from неверна или группа неверна:

select  
    count(pk.id) as "Total",
    lc.fullyqualifiedname as "Name"
from
    tsu pk,
    location lc
where   
    pk.locationid = lc.id
group by 
    lc.id
having 
    lc.id  = :ID;

Из приведенного выше кода я получаю ошибку 00923

Если кто-нибудь может мне помочь - где я ошибся?

То, что мне нужно в конечном итоге, будет

Столбец 1 - общее количество попаданий (кол-во (*)), которые имеют местоположение как lc.id Столбец 2 - имя, которое lc.id представляется как отображаемое полное имя. предоставляя значение другого столбца в таблице соболя.

РЕДАКТИРОВАТЬ:

select  count(pk.id) as "Total",
    lc.fullyqualifiedname as "Name"
from    tsu pk,
    location lc
where   pk.locationid = lc.id
group by lc.id
having lc.id  = :ID;

Этот скрипт работает, однако он отображает столбец 1 из таблицы lc, я хотел бы получить имя столбца из lc display.

- проблема решена с помощью ответного скрипта.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Проблема в том, что lc.fullyqualifiedname появляется в списке select, но не в предложении group by, следовательно, ORA-00979: not a GROUP BY expression.

select count(pk.id) as "Total",
       lc.fullyqualifiedname as "Name"
from   tsu pk,
       location lc
where  pk.locationid = lc.id
and    lc.id  = :id
group by lc.fullyqualifiedname;

или еще лучше,

select count(*) as "Total",
       lc.fullyqualifiedname as "Name"
from   tsu pk
       join location lc on lc.id = pk.locationid
where  lc.id  = 1
group by lc.fullyqualifiedname;

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

0 голосов
/ 06 июля 2018

Для одного lc.id нет необходимости использовать GROUP BY:

select count(pk.id) as "Total",
       min(lc.fullyqualifiedname) as "Name"   -- here agg function
from tsu pk
join location lc                              -- join syntax is preferred
  on pk.locationid = lc.id
where lc.id  = :ID;                           -- filtering with where

В качестве альтернативы:

select count(pk.id) as "Total",
       min(lc.fullyqualifiedname) as "Name",
       lc.id
from tsu pk
join location lc
  on pk.locationid = lc.id
---where lc.id IN (...)
group by lc.id;
...