我需要从exemplar
表中选择目前未订购(预订)的idBook项目 - “orders”表中的dateReturn字段不为空。
表orders
可以包含先前已完成的具有相同idExemplar的订单!
如果示例在“orders”表中至少有一条记录,且dateReturned = null ,则应排除此示例!
select *
from exemplar
join orders on orders.idExemplar=exemplar.idExemplar
where dateReturned is not null
但如果表格订单包含具有相同idExemplar的前期订单,则会产生错误的结果
答案 0 :(得分:3)
如果我正确理解了这个问题,这应该可以解决问题:
select *
from exemplar
where not exists
( select *
from orders
where orders.idExemplar=exemplar.idExemplar
and dateReturned is null )
答案 1 :(得分:1)
了解外连接的理想时间: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html是我最喜欢的例子之一
SELECT *
FROM exemplar
LEFT JOIN orders
on orders.idExemplar=exemplar.idExemplar
WHERE dateReturned is null
对双重遗嘱感到困惑......但是既然你说过,“如果示例在”orders“表中至少有一条记录,并且dateReturned = null,那么应该排除这个范例!” 我想你想要dateReturned IS NULL
答案 2 :(得分:1)
这将返回一个样本列表,其中包含null订单dateReturned order,其中idExemplar只有一行订单
SELECT e.*
FROM exemplar e
INNER JOIN orders o
ON e.idExemplar = o.idExemplar
WHERE
o.idExemplar IN (
SELECT o.idExemplar FROM orders o
GROUP BY o.idExemplar
HAVING COUNT(o.idExemplar) = 1
) AND o.dateReturned IS NULL
这使用where
子句中的子查询来检查当前订单idExemplars是否在唯一idExemplars的集合中。它通过计算每个idExemplar的实例并丢弃任何出现多次的实例来完成此任务。
答案 3 :(得分:1)
与@vizier's answer类似,但表达方式不同:
1)使用NOT IN
:
SELECT *
FROM exemplar
WHERE idExemplar NOT IN (SELECT idExemplar FROM orders WHERE dateReturned IS NULL)
2)使用LEFT JOIN
+ WHERE IS NULL
:
SELECT e.*
FROM exemplar e
LEFT JOIN ON orders o ON e.idExemplar = o.idExemplar AND o.dateReturned IS NULL
WHERE o.idExemplar IS NULL