只在哪里查询?

Posted

技术标签:

【中文标题】只在哪里查询?【英文标题】:Query with only in where? 【发布时间】:2014-11-06 03:28:09 【问题描述】:

sqlite 中是否有类似“only”的关键字?我必须写一个查询来显示只预订红船的水手姓名。所以我目前的查询是:

select s.sname
from sailor s, boat b, reservation r
where s.sname = r.sname
and b.bname = r.bname
and b.color = 'red';

上面查询的问题是它还显示了预定红色+其他颜色船的水手姓名。我的查询结果:

a reserve red boat
a reserve green boat
b reserve red boat

但它应该只显示b,因为他只预订红色船。

【问题讨论】:

【参考方案1】:

您可以使用NOT EXISTS 子句过滤只有redboat 的水手。

select r.sname
from reservation r
join boat b
on b.bname = r.bname
and b.color = 'red'
and not exists ( select 1 from reservation r2
                 join boat b2
                 on r2.bname = b2.bname
                 and r2.sname = r.sname
                 and b2.color <> 'red' )

【讨论】:

谢谢你,但它也显示选择其他颜色船的水手。 @something,我试过了,它给出了正确的结果,这是 sql fiddle sqlfiddle.com/#!7/dbaa2/1【参考方案2】:

存在多个选项。您可以使用NOT IN 运算符,如

select s.sname
from sailor s, boat b, reservation r
where s.sname = r.sname
and b.bname = r.bname
and b.color NOT IN (select distinct color from boat where color <> 'red'); 

此外,并非每个水手都会预订一艘船。所以在这种情况下,你最好使用LEFT JOIN 而不是INNER JOIN。另外,我认为你的意思是做一个group by 水手的名字,如下所示

select s.sname
from sailor s, 
left join reservation r on s.sname = r.sname
left join boat b on b.bname = r.bname
group by s.sname
having count(*) <= 1 and b.color = 'red' 

【讨论】:

谢谢您,我已经尝试了您的两个查询,但结果与我的查询相同。

以上是关于只在哪里查询?的主要内容,如果未能解决你的问题,请参考以下文章

trunk只在2层交换机上有作用么?有了3层 trunk的用途在哪里?

PostgreSQL:在哪里而不是在哪里

SQL 查询某字段数据所在的表

雄辩的查询哪里和条件或哪里和不同的条件

IntelliJ 中添加的原型存储在哪里?

哪里有彩票走势图查询啊?我想了解一下现在的彩票走势状况,不知道哪里查询到啊?