Как использовать AND на том же объекте? - PullRequest
0 голосов
/ 25 сентября 2018

Я хочу получить имена рабочих, которые выполняли заказы в день x И день y.

select name
from worker,
     orders
 where worker.workerid = oders.workerid
   and date = x and date = y;

Поэтому я хочу получить только рабочие, которые выполняли заказы в оба дня.

Ответы [ 5 ]

0 голосов
/ 25 сентября 2018

in (x,y) даст вам работников, которые работали по крайней мере в один из 2 дней.

В то время как здесь вы найдете тех, кто работал 2 разных дня.

group by name
having count(distinct date)=2

Всего вы получаете то, что хотите

select name
from worker,
     orders
 where worker.workerid = oders.workerid
   and date in (x,y)
group by name
having count(distinct date)=2
0 голосов
/ 25 сентября 2018

Самый простой подход состоит в том, чтобы использовать 2 частичных запроса и оператор postgre Intersect:

select name
from worker,
     orders
 where worker.workerid = oders.workerid
   and date = y
INTERSECT
select name
from worker,
     orders
 where worker.workerid = oders.workerid
   and date = x;

При этом останутся только рабочие имена, которые были активны в X AND y.

http://www.postgresqltutorial.com/postgresql-intersect/

Как и операторы UNION и EXCEPT, оператор INTERSECT в PostgreSQL объединяет наборы результатов двух или более операторов SELECT в один набор результатов.Оператор INTERSECT возвращает все строки, которые доступны как в наборе результатов, так и в обоих запросах.

0 голосов
/ 25 сентября 2018

Do GROUP BY.Используйте HAVING, чтобы убедиться в наличии обеих дат.

select name
from worker
join orders
    on worker.workerid = orders.workerid
where date in (x, y)
group by name
having count(distinct date) >= 2

Обратите внимание на переход к современному явному синтаксису JOIN!

0 голосов
/ 25 сентября 2018

Использование двух существует, где предложения ...

SELECT name 
FROM worker AS w
WHERE EXISTS (SELECT 1
    FROM orders AS o 
    WHERE w.workerid = o.workerid
    AND date = x)
AND EXISTS (SELECT 1
    FROM orders AS o 
    WHERE w.workerid = o.workerid
    AND date = y)
0 голосов
/ 25 сентября 2018

попробуйте это:

SELECT name from worker, orders 
WHERE worker.workerid = oders.workerid
    DATE date IN (x, y)
...