#sql #oracle
Вопрос:
SELECT Person_ID, CONCAT('First_name','Surname') AS "Person_Name", Next_of_kin, '~ No next of kin ~' AS Next_of_kin_name, Next_of_kin_age AS NULL
FROM PERSON
WHERE Next_of_kin IS NULL
UNION
SELECT Childs.Person_ID, CONCAT('Childs.First_name','Childs.Surname') AS "Person_name", Next_of_kin, CONCAT('Fathers.First_name','Fathers.Surname') AS "Next_of_kin_name",TO_CHAR(sysdate, 'YYYY') - TO_CHAR(Fathers.birth_date, 'YYYY')
(TO_CHAR(sysdate, 'YYYY')- TO_CHAR(Birth_date, 'YYYY')) AS Next_of_kin_age
FROM Person Childs, Person Fathers
WHERE Childs.next_of_kin = Fathers.Person_ID
AND TO_CHAR(sysdate, 'YYYY') - TO_CHAR(Fathers.birth_date, 'YYYY') >= 50;
Комментарии:
1.
NULL
это зарезервированное слово ( en.wikipedia.org/wiki/SQL_reserved_words ), и не может использоваться в качестве псевдонима столбца. Выберите другой псевдоним или разделите как"NULL"
.2. Во втором списке выбора также отсутствует запятая или что-то еще.
Ответ №1:
- Имя последнего столбца возвращено как
NULL
, но на самом деле вы хотите вернуть значение какNULL
дляNext_of_kin_age
. - Кроме того, вы пропустили оператор в последнем столбце второго выбора, я предположил, что оператор минус.
TO_CHAR(дата рождения, ‘ГГГГ’) — TO_CHAR(Дата рождения, ‘ГГГГ’) (TO_CHAR(дата рождения, ‘ГГГГ’)- TO_CHAR(Дата рождения, ‘ГГГГ’)) КАК Next_of_kin_age
Попробуйте Это
SELECT Person_ID,
CONCAT('First_name','Surname') AS "Person_Name",
Next_of_kin,
'~ No next of kin ~' AS Next_of_kin_name,
NULL AS Next_of_kin_age
FROM PERSON
WHERE Next_of_kin IS NULL
UNION
SELECT Childs.Person_ID,
CONCAT('Childs.First_name','Childs.Surname') AS "Person_name",
Next_of_kin,
CONCAT('Fathers.First_name','Fathers.Surname') AS "Next_of_kin_name",
TO_CHAR(sysdate, 'YYYY') - TO_CHAR(Fathers.birth_date, 'YYYY') - (TO_CHAR(sysdate, 'YYYY') - TO_CHAR(Birth_date, 'YYYY')) AS Next_of_kin_age
FROM Person Childs, Person Fathers
WHERE Childs.next_of_kin = Fathers.Person_ID
AND TO_CHAR(sysdate, 'YYYY') - TO_CHAR(Fathers.birth_date, 'YYYY') >= 50;