#sql #sql-server-2005 #tsql #select #relational-algebra
#sql #sql-server-2005 #tsql #выберите #реляционная алгебра
Вопрос:
Как я могу использовать команды ВЫБОРА или вложенные выборки вместо двух условий в сочетании с ИЛИ? Я знаю, что вы можете реализовать И с вложенными операторами SELECT, используя, например:
select name from (select * from students where grade > C) where age > 25
-- select name from (select * from students where grade > C) as std1 where age > 25
вместо:
select name from students where age > 25 and grade > C
(только с помощью команды select).
Но как вы достигаете условия ИЛИ без использования ИЛИ?
SELECT name FROM students WHERE age > 25 OR grade > C
Комментарии:
1. Я не понимаю, о чем вы спрашиваете?
2. @Duncan: Я полагаю, он спрашивает «как переписать OR, применив фильтр к вложенному запросу»
3. @Quassnoi: Ах! Ваше решение в этом случае хорошее.
Ответ №1:
Применение OR
приводит к надмножеству, а не подмножеству, поэтому вы не можете достичь того же результата, применив фильтр к вложенному запросу.
Вы можете переписать ее с помощью UNION
:
SELECT *
FROM students
WHERE age > 25
UNION
SELECT *
FROM students
WHERE grade > C
это то же самое, что
SELECT *
FROM students
WHERE age > 25 OR grade > C
при условии, что PRIMARY KEY
определено на students
.
Комментарии:
1. только с помощью select. a или b = not (не (a) и не (b))
2. @sohrab: вы не можете сделать это, применив фильтр к вложенному запросу, если вы это имеете в виду.
3. не совсем вложенный запрос. запрос, созданный только с помощью select.я имею в виду перезапись ИЛИ с помощью select.может быть, так:a или b = not (не (a) и не (b))
4. @Jonathan:
UNION
устранит дубликаты, которых не будет в случае определенного PK, но которые могут быть, если их нет.5. @sohrab:
NOT (age <= 25 AND grade <> C)
это то же самое, чтоage > 25 AND grade > C
еслиage
иgrade
не обнуляются.