Использовать команду SELECT вместо двух условий ИЛИ?

#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 не обнуляются.