Странно, что вы «не можете» разрешать TLD с 4 символами. Вы запрещаете людей из .info и .name , а ограничение длины останавливается .travel и .museum , но да, они менее распространены, чем 2-х символов TLD и 3-символьные TLD.
Вы также должны использовать прописные буквы. Системы электронной почты нормализуют локальную часть и часть домена.
Для вашего регулярного выражения части домена имя домена не может начинаться с '-' и не может заканчиваться на '-'. Dash может находиться только между ними.
Если вы использовали библиотеку PEAR, проверьте их функцию почты (забыли точное имя / библиотеку). Вы можете проверить адрес электронной почты, вызвав одну функцию, и проверяет адрес электронной почты в соответствии с определением в RFC822.
Вы должны поместить все столбцы SELECT
в GROUP BY
или использовать на них функции, которые сжимают результаты до одного значения (например, MIN
, MAX
или SUM
).
Простой пример, чтобы понять, почему это происходит: представьте, что у вас есть такая база данных:
FOO BAR
0 A
0 B
и вы запускаете SELECT * FROM table GROUP BY foo
. Это означает, что база данных должна возвращать одну строку в качестве результата с первым столбцом 0
, чтобы выполнить GROUP BY
, но теперь есть два значения bar
. Какой результат вы ожидаете - A
или B
? Или должна ли база данных возвращать более одной строки, нарушая контракт GROUP BY
?
Группа by используется для агрегирования некоторых данных, в зависимости от агрегатной функции, и кроме этого вам нужно поместить столбец или столбцы, для которых вам нужна группировка.
например:
select d.deptno, max(e.sal)
from emp e, dept d
where e.deptno = d.deptno
group by d.deptno;
Это приведет к максимальной заработной плате отделов.
Теперь, если мы опустим d.deptno
из предложения group by, она даст ту же ошибку.
Если вы выполняете поиск в силу предложения GROUP BY
, любое выражение в SELECT
, которое не является групповой функцией (или агрегатной функцией или агрегированной колонкой), например COUNT
, AVG
, MIN
, MAX
, SUM
и т. д. ( Список функций агрегации ) должен присутствовать в GROUP BY
.
Пример (правильный путь) (здесь employee_id
негрупповая функция (неагрегированный столбец), поэтому в GROUP BY
появляется . Напротив, сумма (зарплата) представляет собой групповую функцию (агрегированный столбец), поэтому не требуется появляться в GROUP BY
.
SELECT employee_id, sum(salary)
FROM employees
GROUP BY employee_id;
Пример (неправильный путь) (здесь employee_id
не является групповой функцией и не появляется в предложении GROUP BY
, что приведет к ошибке ORA-00979 .
SELECT employee_id, sum(salary)
FROM employees;
Чтобы исправить, вам нужно сделать one из следующего:
SELECT
в разделе GROUP BY
SELECT
. Вы должны сделать следующее:
SELECT cr.review_sk,
cr.cs_sk,
cr.full_name,
tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt",
cs.cs_id,
cr.tracking_number
from review cr, cs, fact cf
where cr.cs_sk = cs.cs_sk
and UPPER(cs.cs_id) like '%' || UPPER(i_cs_id) || '%'
and row_delete_date_time is null
and cr.review_sk = cf.review_wk (+)
and cr.fact_type_code (+) = 183050
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number, cs.cs_id, cr.full_name
ORDER BY cs.cs_id, cr.full_name;
Слишком плохо Oracle имеет такие ограничения. Конечно, результат для столбца, не входящего в GROUP BY, будет случайным, но иногда вы этого хотите. Глубокий Oracle, вы можете сделать это в MySQL / MSSQL.
НО есть работа для Oracle:
Пока следующая строка не работает
SELECT unique_id_col, COUNT(1) AS cnt FROM yourTable GROUP BY col_A;
Вы можете обмануть Oracle с некоторыми 0, как показано ниже, чтобы сохранить свой столбец в области видимости, но не группировать его (предполагая, что это числа, в противном случае использовать CONCAT)
SELECT MAX(unique_id_col) AS unique_id_col, COUNT(1) AS cnt
FROM yourTable GROUP BY col_A, (unique_id_col*0 + col_A);
Включить в GROUP BY
предложение все SELECT
выражения, которые не являются аргументами групповой функции.
Такая же ошибка также возникает, когда ключевое слово UPPER или LOWER не используется в обоих случаях в выражении select и group по выражению.
Неверно: -
select a , count(*) from my_table group by UPPER(a) .
Вправо: -
select UPPER(a) , count(*) from my_table group by UPPER(a) .