Субвыбор Sql ORA-00918

#sql #oracle

#sql #Oracle

Вопрос:

Это мой Sql:

 SELECT 
    t.RUFNAME,
    count(v_anschrift.rufname) as Anrufe
FROM v_termin,
(
    SELECT 
    RUFNAME
    FROM
    V_Anschrift
    WHERE V_ANSCHRIFT.SPERRKZ = 0
    AND V_ANSCHRIFT.OEM != 0 
) t
JOIN v_anschrift ON (t.Rufname = v_anschrift.RUFNAME)
LEFT JOIN v_termin ON (v_termin.anschriftid = v_anschrift.anschriftid)
WHERE v_termin.TERMINART = 20
GROUP BY t.RUFNAME;
  

И я получаю это сообщение об ошибке:

ORA-00918: Spalte nicht eindeutig definiert 00918. 00000 — «column ambiguously defined» *Cause:
*Action: Fehler in Zeile: 15 Spalte: 7

в чем моя ошибка?

Комментарии:

1. Не смешивайте явные и неявные объединения. Переключитесь на современный, явный JOIN синтаксис везде! Проще писать (без ошибок), легче читать и поддерживать, и при необходимости легче преобразовать во внешнее соединение.

2. В предложении FROM дважды используется v_termin. Намеренно? Используйте разные псевдонимы таблиц.

3. Почему вы дважды подключаетесь к v_anschrift ? и v_termin ? Ограничение на sperrkz и oem может быть легко добавлено к условию объединения. Я не вижу причины для начала выбирать подвыборку.

4. Просто: у вас есть a FROM v_termin , а затем a LEFT JOIN v_termin , и вы неправильно называете свои таблицы, поэтому Oracle не может определить, из какой таблицы v_termin.anschriftid = . Я начал писать исправление, но остановился, потому что в вашем запросе беспорядок, особенно в подзапросе, в котором нет ПРЕДЛОЖЕНИЯ ON.

5. Die вы имеете в виду что-то вроде этого: cryptb.in/L7rn

Ответ №1:

Я подозреваю, что вы действительно хотите что-то вроде этого:

 SELECT t.RUFNAME, COUNT(*) as  Anrufe
FROM v_termin t JOIN
     v_anschrift a
     ON t.anschriftid = a.anschriftid
WHERE t.TERMINART = 20 AND
      a.SPERRKZ = 0 AND
      a.OEM <> 0 
GROUP BY t.RUFNAME;
  

У вас повторяющиеся ссылки на таблицы в FROM предложении — и повторения не имеют очевидной логики.