如何在同一实体上使用 AND?

How to use AND on the same entity?

我想获取在第 x 天和第 y 天下订单的工人的姓名。

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

所以我只想得到这两天都下订单的工人。

试试这个:

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

做一个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 语法!

使用两个 exists where 子句...

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)

最简单的方法是使用 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/

Like the UNION and EXCEPT operators, the PostgreSQL INTERSECT operator combines the result sets of two or more SELECT statements into a single result set. The INTERSECT operator returns any rows that are available in both result set or returned by both queries.

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