Я хочу принести информацию академиков, которые не в другой таблице

У меня есть база данных с подмостками

  • ПОЛЬЗОВАТЕЛЬ,
  • АКАДЕМИК,
  • INFORMACION_PERSONAL,
  • СЕКЦИЯ.

Я хочу принести информацию всех академиков, которые не в таблице СЕКЦИЯ и которые являются активными пользователями используя следующую консультацию:

 SELECT ACADEMICO.id_usuario,INFORMACION_PERSONAL.nombre,INFORMACION_PERSONAL.aPaterno,INFORMACION_PERSONAL.aMaterno 
   FROM ACADEMICO 
NATURAL JOIN INFORMACION_PERSONAL 
NATURAL JOIN USUARIO 
  WHERE USUARIO.estado=1 
    AND ACADEMICO.id_usuario NOT IN (SELECT id_usuario FROM SECCION)

Но он посылает мне поля в мишени, хотя он был бы должен мне возвращать два.

Подмостки соразмерены следующего способа:Descripción de tablas Кто-то, кто мог бы ориентироваться?

3
задан 28.12.2016, 07:57
0 ответов

Проблема состоит в том, что у тебя вероятно есть стоимость null в колонне id_usuario твоей таблицы SECCION. Твоя структура показывает, что эта колонна позволяет стоимость null.

Того, чтобы быть случаем, с которым у тебя есть только реестр с id_usuario = null в таблице SECCION, claúsula NOT IN () он вызовет, что твоя консультация не возвратила тебе никакого результата.

Например, если предоставленный том SQLFiddle Относящегося к Богородице в Вашем комментарии, и я это изменяю, чтобы добавлять реестр в таблице SECCION с id_usuario = null, ты увидишь, что консультация уже не функционирует правильно: SQLFiddle, который не функционирует ввиду стоимости null.

Проблема - что оценки booleanas со стоимостью null никогда они не оценивают в true. Так что эта часть твоей консультации:

AND ACADEMICO.id_usuario NOT IN (SELECT id_usuario FROM SECCION)

... если он сталкивается с реестром где SECCION.id_usuario он null, условие равняется в:

AND ACADEMICO.id_usuario <> null

... то, что он не оценит в true.

Чтобы предотвращать эту очень тонкую проблему, я предлагаю тебе использовать NOT EXISTS вместо NOT IN.

Я написал бы консультацию таким образом (ощутись, что я предпочитаю предотвращать уроженец joins, но эта деталь не важна в этом случае):

 SELECT a.id_usuario,
        i.nombre,
        i.aPaterno,
        i.aMaterno 
   FROM ACADEMICO a 
   JOIN INFORMACION_PERSONAL i
     ON i.id_usuario = a.id_usuario
   JOIN USUARIO u
     ON u.id_usuario = a.id_usuario
  WHERE u.estado = 1 
    AND NOT EXISTS (SELECT NULL
                      FROM SECCION s
                     WHERE s.id_usuario = a.id_usuario)

SQLFiddle, который функционирует хорошо несмотря на стоимость null.

1
ответ дан 03.12.2019, 17:57