2

我需要从exemplar当前未订购(预订)的表中选择具有已定义 idBook 的项目- “订单”表中的 dateReturn 字段不为空。

表格orders可以包含以前履行的具有相同 idExemplar 的订单!

如果 exemplar在“orders”表中至少有一条 dateReturned=null 记录,则应排除此示例!

我试过使用这个查询:

select * 
from exemplar 
join orders on orders.idExemplar=exemplar.idExemplar
where dateReturned is not null

但如果表订单包含先前已履行的具有相同 idExemplar 的订单,则会给出错误的结果

4

4 回答 4

3

如果我正确理解了这个问题,这应该可以解决问题:

select * 
from exemplar 
where not exists 
  ( select * 
    from orders 
    where orders.idExemplar=exemplar.idExemplar 
    and dateReturned is null )
于 2012-05-19T18:20:08.967 回答
1

类似于@vizier 的回答,但表达方式不同:

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
于 2012-05-19T18:37:13.413 回答
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 

对双重不感到困惑......但既然你说过,“如果示例在“订单”表中至少有一条记录,并且 dateReturned=null 那么这个示例应该被排除在外!” 我想你想要 dateReturned IS NULL

于 2012-05-19T18:17:47.870 回答
1

这将返回一个示例列表,其中包含空订单 dateReturned 订单,其中 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 的实例并丢弃任何出现多次的实例来做到这一点。

于 2012-05-19T18:26:15.190 回答