非标准的SQL查询

时间:2012-05-19 18:11:06

标签: mysql sql select

我需要从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的前期订单,则会产生错误的结果

4 个答案:

答案 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