Как переименовать и ссылаться на COUNT (*) в операторе SELECT? - PullRequest
0 голосов
/ 28 апреля 2019

Я пытаюсь использовать COUNT (*) в операторе SELECT. Однако мне нужно переименовать его и иметь возможность ссылаться на него для предложения WHERE.

Я пытался использовать AS, и я пытался опустить AS, поскольку, согласно странице оракула, в этом нет необходимости: https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions032.htm

Попытка обернуть новый идентификатор в кавычки, но это тоже не сработало.

Это работает, но дает сгенерированное оракулом имя для счетчика, что не идеально, и я не знаю, как ссылаться на счетчик для каждой строки:

SELECT
    school_name,
    (SELECT COUNT(*)
    FROM liason_to
    WHERE school_name = s.school_name)
FROM school s;

Это то, что я пытался, но не сработает:

SELECT
    school_name,
    (SELECT COUNT(*) AS numLiasons
    FROM liason_to
    WHERE school_name = s.school_name)
FROM school s
WHERE numLiasons > 0;

Это не делает имя столбца "numLiasons", а предложение where в конце не знает, что такое numLiasons, поэтому происходит сбой.

Ответы [ 3 ]

1 голос
/ 28 апреля 2019

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

SELECT school_name,
       (SELECT count(*)
               FROM liason_to l
               WHERE l.school_name = s.school_name) AS numliasons
       FROM school s;

или просто

SELECT school_name,
       (SELECT count(*)
               FROM liason_to l
               WHERE l.school_name = s.school_name) numliasons
       FROM school s;

Но вы не можете использовать псевдонимы в предложении WHERE (создание псевдонимов происходит после записейбыли выбраны по критериям в пункте WHERE).Вы должны повторить выражение.

SELECT school_name,
       (SELECT count(*)
               FROM liason_to l
               WHERE l.school_name = s.school_name) numliasons
       FROM school s
       WHERE (SELECT count(*)
                     FROM liason_to l
                     WHERE l.school_name = s.school_name) > 0;
1 голос
/ 28 апреля 2019

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

SELECT s.school_name, COUNT(*) as my_count 
FROM school s 
INNER JOIN liason_to l on s.school_name = l.school_name 
GROUP BY s.school_name 

, используя свой код, вы можете просто назначить псевдоним в (выбранном) столбце

SELECT
    school_name,
    (SELECT COUNT(*)
    FROM liason_to
    WHERE school_name = s.school_name) as my_name 
FROM school s;

в любом случае для фильтрации агрегированного результата, который вы можете использовать, но для count(*) помните, что эта работа только для ненулевых строк, поэтому обычно count (*)> 0

0 голосов
/ 28 апреля 2019

Нельзя ссылаться на псевдоним в предложении WHERE, но вы можете сделать это:

SELECT
    t.school_name,
    t.numLiasons
FROM (
  SELECT  
    s.school_name,
    (
      SELECT COUNT(*) 
      FROM liason_to
      WHERE school_name = s.school_name
    ) AS numLiasons
  FROM school s
) t
WHERE t.numLiasons > 0;
...