首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL :不带FROM子句的子查询

问SQL :不带FROM子句的子查询
EN

Stack Overflow用户
提问于 2017-06-28 18:19:21
回答 2查看 549关注 0票数 1

这是表格的结构

代码语言:javascript
复制
CREATE TABLE Book_Tag (id INT, Book_Id INT, tag varchar(20))

CREATE TABLE Book_Master (Book_Id INT, Book_title VARCHAR(50), price INT)

数据看起来如下:

代码语言:javascript
复制
INSERT INTO Book_Master
SELECT 1, 'Good Profit', 28 UNION ALL
SELECT 2, 'The Secret', 20 UNION ALL
SELECT 3, 'The One Minute Manager', 9 UNION ALL
SELECT 4, 'The 7 Habits of Highly Effective People', 35 UNION ALL
SELECT null, 'Who Moved My Cheese?', 15 UNION ALL
SELECT null, 'Blink: The Power of Thinking Without Thinking', 40

INSERT INTO Book_Tag
SELECT 1, 1, 'Management' UNION ALL
SELECT 2, 1, 'Profit' UNION ALL
SELECT 3, 2, 'Mind' UNION ALL
SELECT 4, 3, 'Management' UNION ALL
SELECT 5, 3, 'Efficiency' UNION ALL
SELECT 6, 3, 'Success' UNION ALL
SELECT 7, 4, 'Success' UNION ALL
SELECT 8, null, 'Time' UNION ALL
SELECT 9, 6, 'SelfHelp' UNION ALL
SELECT 10, 6, 'Motivation' UNION ALL
SELECT 11, 8, 'Mind'

select * from Book_Master

代码语言:javascript
复制
Book_Id Book_title                                      price
1           Good Profit                                     28
2           The Secret                                      20
3           The One Minute Manager                          9
4           The 7 Habits of Highly Effective People         35
NULL        Who Moved My Cheese?                            15
NULL        Blink: The Power of Thinking Without Thinking   40

select * from Book_Tag

代码语言:javascript
复制
id  Book_Id tag
1   1       Management
2   1       Profit
3   2       Mind
4   3       Management
5   3       Efficiency
6   3       Success
7   4       Success
8   NULL    Time
9   6       SelfHelp
10  6       Motivation
11  8       Mind

我不知道为什么以下是有效的,也不知道为什么结果是这样。

代码语言:javascript
复制
select BT.* from Book_Tag BT
where BT.Book_Id in (select id)

id  Book_Id tag
1   1       Management

或者这个

代码语言:javascript
复制
select BT.* from Book_Tag BT
where BT.Book_Id not in (select id)

id  Book_Id tag
2   1       Profit
3   2       Mind
4   3       Management
5   3       Efficiency
6   3       Success
7   4       Success
9   6       SelfHelp
10  6       Motivation
11  8       Mind
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-28 18:38:53

您的第一个查询:

代码语言:javascript
复制
select BT.* 
from Book_Tag BT
where BT.Book_Id in (select id); 

它与以下内容相同:

代码语言:javascript
复制
select BT.* 
from Book_Tag BT
where BT.Book_Id = BT.id;

所以你才能

1 1 Management

请记住,NULL并不等于NULL或其他任何东西。

在第二个例子中,您有:

代码语言:javascript
复制
select BT.* 
from Book_Tag BT
where BT.Book_Id not in (select id);

这与以下相同:

代码语言:javascript
复制
select BT.* 
from Book_Tag BT
where BT.Book_Id <> BT.id;

注意,没有8 NULL Time行。

编辑:

但是,在Subquery中,我们不应该指定id来自的表吗?

来自MSDN

一般规则是,语句中的列名由FROM子句中引用的表在同一级别隐式限定。如果子查询的FROM子句中引用的表中不存在列,则该列由外部查询的FROM子句中引用的表隐式限定。

和

如果在子查询中引用的列不存在于子查询的FROM子句引用的表中,而是存在于外部查询的FROM子句引用的表中,则查询将无错误地执行。Server隐式地限定子查询中的列与外部查询中的表名。。

票数 2
EN

Stack Overflow用户

发布于 2017-06-28 18:23:53

您在这里问“BT.Book_Id in (select ID )在哪里”,意思是Book_ID =ID,所以在本例中它打印出来了。Book_ID和ID都是1,那么,当它们不相等时就不是了,这是表中的其他所有内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44809882

复制
相关文章

相似问题

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