首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不包括列值的连接记录?

问不包括列值的连接记录?
EN

Stack Overflow用户
提问于 2016-11-29 22:28:47
回答 3查看 21关注 0票数 2

例如,如果我有球体和盒子,球可以在很多盒子里,盒子可以被锁定,我如何选择没有被锁定的球?

代码语言:javascript
复制
balls
  id  name
  ==  ====
  1   in neither
  2   in unlocked
  3   in locked
  4   in both

boxes
  id  locked
  ==  ======
  1   0
  2   1

boxings
  ball_id box_id
  ======= ======
  2       1
  3       2
  4       1
  4       2

我已经提出了这个使用左联接,但它是返回“在两个”的球,我想排除。

代码语言:javascript
复制
SELECT balls.* 
FROM balls 
LEFT OUTER JOIN boxings ON boxings.ball_id = balls.id 
LEFT OUTER JOIN boxes ON boxes.id = boxings.box_id 
WHERE (boxings.box_id IS NULL or boxes.locked = 0)
  AND boxes.id NOT IN (
    SELECT id FROM boxes WHERE locked = 1
    )

预期结果:

代码语言:javascript
复制
id  name
==  ====
1   in neither
2   in unlocked

SQL:http://sqlfiddle.com/#!9/c26ab/4

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-29 22:31:06

我猜你的意思是:选择永远不会被锁在盒子里的球。

如果是这样,就会想到一个not exists查询:

代码语言:javascript
复制
select b.*
from balls b
where not exists (select 1
                  from boxings bxb join
                       boxes bo
                       on bxb.box_id = bo.id
                  where bxb.ball_id = b.id and bo.locked = 1
                 );
票数 2
EN

Stack Overflow用户

发布于 2016-11-29 22:37:27

最直接的方法可能是使用NOT EXISTS。

代码语言:javascript
复制
select id, name 
from balls 
where not exists (
  select NULL 
  from boxings 
  inner join boxes on boxes.id = boxings.box_id 
  where boxes.locked = 1
  and boxings.ball_id = balls.id
)
票数 0
EN

Stack Overflow用户

发布于 2016-11-30 09:04:42

我发现有趣的是,已经发布的两个答案都采用了相同的稍微奇怪的方法,将一些联接条件放在WHERE子句中:

代码语言:javascript
复制
inner join boxes on boxes.id = boxings.box_id
where boxes.locked = 1

最奇怪的是,我确信 clauses。

无论如何,反连接方法有一个不同的变体:

代码语言:javascript
复制
SELECT *
  FROM balls
 WHERE id NOT IN ( SELECT ball_id
                     FROM boxings
                          NATURAL JOIN 
                          ( SELECT id AS box_id FROM boxes WHERE locked = 1 )
                          NATURAL JOIN 
                          ( SELECT id AS ball_id FROM boxings ) );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40876963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档