как вы ищете правые / левые соединения? - PullRequest
2 голосов
/ 04 августа 2009

У меня проблема с поиском в нескольких таблицах У меня есть 2 таблицы

tblcourse

-courseid

-name

-status

tblenroll

-курс (содержит Courseid из tblcourse)

-studentid

Допустим, у студента 1990 год как число студентов, и он зарегистрировался на 2 курса в tblenrol

Я хочу получить название курсов, которые были в 1990 году, и тех, на которые он не подписался

самое близкое, что я получаю, - это правильное внешнее соединение с tblcourses, тогда я получаю желаемый результат, но как только я присоединяю предложение where, оно не даст мне остальные курсы, у которых нет номера его студента.

Любая помощь !!

РЕДАКТИРОВАТЬ (добавлено из ответа, опубликованного оп)

Привет, спасибо за ответ. Хорошо, я не думаю, что объяснил это правильно.

tblcourse проведет много курсов Tblenroll проводит много зачислений

Итак, представьте, у нас есть 6 курсов. Студент 1990 регистрируется на 3, а студент 1880 на 1 (тот, который 1990 не выбрал)

Когда мы запустим это:

WHERE (tblenroll.studentid = 1990 or tblenroll.studentid is null)

или

where e.studentid is null or  e.studentid is not null and e.studentid = 1990

он подберет 5 курсов, 3 зарегистрированных до 1990 года и 2 NULLS. Шестой зарегистрирован в 1880 году.

Этот запрос приносит правильные результаты, но не для конкретного учащегося

SELECT
    tblenroll.studentid as stud,
    tblcourse.name,
    tblenroll.studentid,
    tblenroll.courseid,
    tblcourse.courseid,
FROM
    tblenroll
Right Join tblcourse ON tblenroll.courseid = tblcourse.courseid 

С вышеизложенным я получу

1880 - 1 1990 - 3 NULL - 2

запутанные вещи!

Ответы [ 2 ]

2 голосов
/ 04 августа 2009
select tblcourse.name, e.studentid
from tblcourse c left join tblenroll e on c.courseid = e.courseid
where e.studentid is null or  e.studentid is not null and e.studentid = :id

это приведет к

course1 1990
course2 NULL
course3 NULL
course4 1990
...

в зависимости от вашей БД, вы можете использовать своего рода функцию IIF для установки 1 или 0, true или false - любой флаг в качестве второго элемента

0 голосов
/ 04 августа 2009

Вам, вероятно, нужно просто указать, что студент имеет нулевое значение, а также фактический идентификатор, который вы запрашиваете.

Попробуйте, например:

SELECT tblenroll.studentid, tblcourse.courseid, tblcourse.name, tblcourse.status
FROM tblenroll RIGHT OUTER JOIN tblcourse ON tblenroll.courseid = tblcourse.courseid
WHERE (tblenroll.studentid = 1990 
or tblenroll.studentid is null) -- this allows the courses in which 1990 is not enrolled

Edit: я не совсем думал об этом в первый раз. Приведенный выше запрос является моим наивным подходом и, вероятно, возвращает те же результаты, которые не нужны OP . Хитрость заключается не в том, чтобы использовать предложение where после объединения таблиц, а в том, чтобы ограничить число строк из tblenroll, которые участвуют в объединении.

Я полагаю, что это должно работать (я проверял это с аналогичными таблицами / структурой на SQL Server 2005):

SELECT tblenroll.studentid, tblcourse.courseid, tblcourse.name, tblcourse.status
FROM tblenroll RIGHT OUTER JOIN tblcourse ON tblenroll.courseid = tblcourse.courseid
    AND tblenroll.studentid = 1990
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...