Как сформулировать оператор выбора так: если определенный атрибут достигает определенного значения домена; выберите значения там, где его нет - PullRequest
0 голосов
/ 04 марта 2020

Я хочу отобразить результат значения, если это значение соответствует критериям: результат должен показать человека, который не читает лекции в курсе «КАК», а затем вместе с этим именем также показать его / ее номер телефона. Естественный языковой формат, о котором я думаю, это выбрать отличный namn, тел из таблицы, где, если namn имеет значение псевдонима 'AS', точка не показывает этот namn. выберите отличный номер телефона от finalver2, где ник <> 'AS'; Имя Лизенса все равно будет отображаться, так как у нее также есть мастер-класс, и я не хочу, чтобы ее имя появлялось.

Результат должен выглядеть следующим образом:

namn       tel
Faramarz   1054

Результат выше должен быть получен из следующего сценария:

nickname    kkod        namn        sport       ford        tel
----------  ----------  ----------  ----------  ----------  ----------
eGOV        TIG098      Lisen       Fotboll     Cykel       1076
AS          TIG162      Lisen       Fotboll     Cykel       1076
AS          TIG162      Lisen       Fotboll     Cykel       1076
AS          TIG162      Lisen       Fotboll     Cykel       1076
BSS         TIG163      Faramarz    Fotboll     Cykel       1054
BSS         TIG163      Faramarz    Fotboll     Cykel       1054
BSS         TIG163      Faramarz    Fotboll     Cykel       1054
BSS         TIG163      Faramarz    Fotboll     Cykel       1054
Masters     TIA019      Lisen       Fotboll     Cykel       1076

Как мне сформулировать оператор выбора? Оцените помощь!

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Хитрость заключается не в том, чтобы отфильтровывать те самые строки, которые вам нужны, когда вы пытаетесь выбрать те, которые не соответствуют. Возможно, что-то вроде:

SELECT DISTINCT profs.namn, profs.tel
FROM (SELECT DISTINCT namn, tel FROM Courses) as profs
LEFT JOIN Courses c ON profs.namn = c.namn AND c.nickname = 'AS'
WHERE c.namn IS NULL

Подзапрос (profs) дает вам список каждого профессора и их телефонный номер без дубликатов (обратите внимание, если они перечислены с более чем одним телефонным номером, вы ' Я получу их отдельно с каждым номером телефона). Затем это LEFT СОЕДИНЯЕТСЯ со всей таблицей, чтобы связать каждого преподавателя с его курсами, но предложение ON также ограничивает эти совпадения тем курсом, который вы исключите sh (вы также можете использовать IN и список из нескольких значений), поэтому только те профессора, которые не преподают класс 'AS' (или любой из списка IN, если вы его используете), не смогут соответствовать предложению ON и приведут к значениям NULL для таблицы c в результате внешнего соединения .

Предложение WHERE применяется после вычисления внешнего соединения и выбирает только те, которые имеют значения NULL, другими словами, те, которые не обучают указанному классу (классам). DISTINCT во внешнем SELECT может не потребоваться. Размещение условий в выражениях WHERE или определенных ON включено при использовании внешних объединений.

Могут быть и другие способы сделать это; Я не уверен, что это лучше, но я думаю, что это сработает. Вероятно, есть способ сделать это с помощью Count, GROUP BY и HAVING, но я думаю, что это в конечном итоге примерно такой же сложности (с очень похожей структурой) и не так гибко.

1 голос
/ 04 марта 2020

Вы можете group by имя учителя и фильтровать с предложением having на тех, кто никогда не читал курс 'AS'.

select naam, tel
from mytable
group by nanm, tel
having max(nickname = 'AS') = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...