Неизвестный столбец «xxx» в «on оговорке» - PullRequest
0 голосов
/ 19 октября 2018

У меня есть запрос SQL, который выглядит следующим образом:

SELECT 
    a.id user_id, a.type, a.email_address, 
    a.name_first, a.name_last, languages.title as language,
    b.created_at purchased_on, b.expires_at watchable_until,
    c.title,
    d.title topic,
    e.title category,
    f.subject, f.grade
FROM users a,
     user_video_purchases b,
     videos c,
     gradesubject_category_topics d,
     gradesubject_categories e,
     gradesubjects f
JOIN languages ON 
          users.language_preferred_id = languages.id
WHERE a.id = b.user_id
      AND b.video_id = c.id
      AND c.gradesubject_category_topic_id = d.id
      AND d.gradesubject_category_id = e.id
      AND e.gradesubject_id = f.id
ORDER BY purchased_on DESC;

Этот запрос возвращает следующее сообщение об ошибке:

Неизвестный столбец 'users.language_preferred_id' in 'в предложении'

Столбцы существуют в таблице users, и, насколько я знаю, JOIN является правильным.

Может кто-нибудь указать, где я могу пойти не так?

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Вы смешиваете синтаксис старой школы и современного соединения.Вы должны использовать только последнее:

SELECT a.id user_id, a.type, a.email_address, a.name_first, a.name_last,
    l.title as language,
    b.created_at purchased_on,
    b.expires_at watchable_until,
    c.title,
    d.title topic,
    e.title category,
    f.subject, f.grade
FROM users a
INNER JOIN user_video_purchases b
    ON a.id = b.user_id
INNER JOIN videos c
    ON b.video_id = c.id
INNER JOIN gradesubject_category_topics d
    ON c.gradesubject_category_topic_id = d.id
INNER JOIN gradesubject_categories e
    ON d.gradesubject_category_id = e.id
INNER JOIN gradesubjects f
    ON e.gradesubject_id = f.id
INNER JOIN languages l
    ON a.language_preferred_id = l.id
ORDER BY
    purchased_on DESC;
0 голосов
/ 19 октября 2018
  • Пожалуйста, прекратите использование неявных объединений на основе запятых и используйте Явный Join синтаксис на основе
  • Используйте Правильное псевдонимы , и как только таблица будет псевдонимом;Вы должны ссылаться на его столбец, используя только Псевдоним .
  • Кроме того, в случае многостоловых запросов всегда обращайтесь к столбцу вместе с именем / псевдонимом таблицы.Это позволит избежать неоднозначного поведения в случае, когда несколько столбцов имеют одинаковые имена в разных таблицах.

Вот переработанный код с использованием явных объединений:

SELECT a.id            AS user_id,
       a.type,
       a.email_address,
       a.name_first,
       a.name_last,
       g.title         AS language,
       b.created_at    AS purchased_on,
       b.expires_at    AS watchable_until,
       c.title,
       d.title         AS topic,
       e.title         AS category,
       f.subject,
       f.grade
FROM   users a
       JOIN user_video_purchases b
         ON a.id = b.user_id
       JOIN videos c
         ON b.video_id = c.id
       JOIN gradesubject_category_topics d
         ON c.gradesubject_category_topic_id = d.id
       JOIN gradesubject_categories e
         ON d.gradesubject_category_id = e.id
       JOIN gradesubjects f
         ON e.gradesubject_id = f.id
       JOIN languages g
         ON a.language_preferred_id = g.id
ORDER  BY purchased_on DESC;  
0 голосов
/ 19 октября 2018

Лучше, если вы используете явное объединение, как показано ниже

SELECT a.id user_id, a.type, a.email_address, a.name_first, a.name_last, languages.title as language,
                                          b.created_at purchased_on, b.expires_at watchable_until,
                                          c.title,
                                          d.title topic,
                                          e.title category,
                                          f.subject, f.grade
                                     FROM users a inner join
                                          user_video_purchases b on a.id = b.user_id
                                          inner join videos c on b.video_id = c.id
                                          inner join gradesubject_category_topics d on c.gradesubject_category_topic_id = d.id
                                          inner join gradesubject_categories e on d.gradesubject_category_id = e.id
                                          inner join gradesubjects f on e.gradesubject_id = f.id
                                          inner JOIN languages l ON a.language_preferred_id = l.id

                                    ORDER BY purchased_on DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...