CREATE TABLE [dbo].[a] ( [id] [int] NULL , [name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY] GOCREATE TABLE [dbo].[b] ( [id] [int] NULL , [aid] [int] NULL , [add1] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY] GOCREATE TABLE [dbo].[c] ( [id] [int] NULL , [bid] [int] NULL , [uname] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY]insert into a values(1,'《学习123》') insert into a values(2,'《学习456》') insert into a values(3,'《学习789》') insert into a values(4,'《学习abc》') insert into b values(1,1,'A书架') insert into b values(2,2,'B书架') insert into b values(3,3,'C书架') insert into b values(4,3,'D书架') insert into c values(1,1,'张三') insert into c values(2,2,'李四') insert into c values(3,3,'王五') insert into c values(4,3,'马六')select a.id,a.name,(select d.e from (select b.id e) d),b.id from a,b,c where a.id=b.aid and b.id=c.bid group by a.id,a.name,b.id
select a.id,a.name,(select b.id),b.id from a,b,c where a.id=b.aid and b.id=c.bid group by a.id,a.name,b.id drop table a,b,c/*id name id ----------- -------------------------------------------------- ----------- ----------- 1 《学习123》 1 1 2 《学习456》 2 2 3 《学习789》 3 3(3 行受影响)id name id ----------- -------------------------------------------------- ----------- ----------- 1 《学习123》 1 1 2 《学习456》 2 2 3 《学习789》 3 3(3 行受影响)*/
select a.id,a.name, (select d.e from (select b.id e) d), b.id from a,b,c where a.id=b.aid and b.id=c.bid group by a.id,a.name,b.id go select a.id,a.name, (select b.id), b.id from a,b,c where a.id=b.aid and b.id=c.bid group by a.id,a.name,b.id go /* id name id ----------- -------------------------------------------------- ----------- ----------- 1 《学习123》 1 1 2 《学习456》 2 2 3 《学习789》 3 3(3 行受影响)id name id ----------- -------------------------------------------------- ----------- ----------- 1 《学习123》 1 1 2 《学习456》 2 2 3 《学习789》 3 3(3 行受影响)*/
这种写法是有问题的: (select d.e from (select a.id e) d),子查询语句是不完整的,你这里 a.id 是指什么?当前查询的 a 表的 id?
我也认为这样写是不对的,但是sqlserver的确支持这样的语法嘛。顺便提一下,如果虚拟一张表出来(就是select 1 id union select 2 id这种写法)。。 a.id就查不到了。如SQL:select a.id,a.name,(select b.a from (select b.id a) b),b.id from ( select 1 id,'《学习123》' name union select 2 id,'《学习456》' name union select 3 id,'《学习789》' name union select 4 id,'《学习abc》' name ) a , ( select 1 id,1 aid,'A书架' add1 union select 2 id,2 aid,'B书架' add1 union select 3 id,3 aid,'C书架' add1 union select 4 id,3 aid,'D书架' add1 ) b , ( select 1 id,1 bid,'张三' uname union select 2 id,2 bid,'李四' uname union select 3 id,3 bid,'马六' uname union select 4 id,3 bid,'张三' uname ) c where a.id=b.aid and b.id=c.bid group by a.id,a.name,b.id
select 1 id union select 2 id这是把1,2,当成别名ID了.
如果严格地按照 inner join 的写法,你的查询语句是错的.
什么意思呢?有点没懂。 你试一下 上面那个SQL嘛。会说服务器: 消息 207,级别 16,状态 3,行 1 列名 'id' 无效。但是如果写这样的SQL,就是正常的,两个的区别 也仅仅是那个子查询。select a.id,a.name,(select b.id),b.id from ( select 1 id,'《学习123》' name union select 2 id,'《学习456》' name union select 3 id,'《学习789》' name union select 4 id,'《学习abc》' name ) a , ( select 1 id,1 aid,'A书架' add1 union select 2 id,2 aid,'B书架' add1 union select 3 id,3 aid,'C书架' add1 union select 4 id,3 aid,'D书架' add1 ) b , ( select 1 id,1 bid,'张三' uname union select 2 id,2 bid,'李四' uname union select 3 id,3 bid,'马六' uname union select 4 id,3 bid,'张三' uname ) c where a.id=b.aid and b.id=c.bid group by a.id,a.name,b.id
[id] [int] NULL ,
[name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GOCREATE TABLE [dbo].[b] (
[id] [int] NULL ,
[aid] [int] NULL ,
[add1] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GOCREATE TABLE [dbo].[c] (
[id] [int] NULL ,
[bid] [int] NULL ,
[uname] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]insert into a values(1,'《学习123》')
insert into a values(2,'《学习456》')
insert into a values(3,'《学习789》')
insert into a values(4,'《学习abc》')
insert into b values(1,1,'A书架')
insert into b values(2,2,'B书架')
insert into b values(3,3,'C书架')
insert into b values(4,3,'D书架')
insert into c values(1,1,'张三')
insert into c values(2,2,'李四')
insert into c values(3,3,'王五')
insert into c values(4,3,'马六')select
a.id,a.name,(select d.e from (select b.id e) d),b.id
from
a,b,c
where
a.id=b.aid and b.id=c.bid
group by
a.id,a.name,b.id
select
a.id,a.name,(select b.id),b.id
from
a,b,c
where
a.id=b.aid and b.id=c.bid
group by
a.id,a.name,b.id
drop table a,b,c/*id name id
----------- -------------------------------------------------- ----------- -----------
1 《学习123》 1 1
2 《学习456》 2 2
3 《学习789》 3 3(3 行受影响)id name id
----------- -------------------------------------------------- ----------- -----------
1 《学习123》 1 1
2 《学习456》 2 2
3 《学习789》 3 3(3 行受影响)*/
SQL1执行出来,是这样的结果。1 《学习123》 1 1
1 《学习123》 2 2
1 《学习123》 3 3
1 《学习123》 4 4
2 《学习456》 1 1
2 《学习456》 2 2
2 《学习456》 3 3
2 《学习456》 4 4
3 《学习789》 1 1
3 《学习789》 2 2
3 《学习789》 3 3
3 《学习789》 4 4
(select d.e from (select b.id e) d),
b.id from a,b,c
where a.id=b.aid and b.id=c.bid group by a.id,a.name,b.id
go
select a.id,a.name,
(select b.id),
b.id from a,b,c
where a.id=b.aid and b.id=c.bid group by a.id,a.name,b.id
go
/*
id name id
----------- -------------------------------------------------- ----------- -----------
1 《学习123》 1 1
2 《学习456》 2 2
3 《学习789》 3 3(3 行受影响)id name id
----------- -------------------------------------------------- ----------- -----------
1 《学习123》 1 1
2 《学习456》 2 2
3 《学习789》 3 3(3 行受影响)*/
我和我一同事上,都是sqlserver2000,都是这样的结果。没有其它版本的sqlserver,所以没测试到。
(select d.e from (select b.id e) d),
b.id from a,b,c
where a.id=b.aid and b.id=c.bid group by a.id,a.name,b.id
go
select a.id,a.name,
(select b.id),
b.id from a,b,c
where a.id=b.aid and b.id=c.bid group by a.id,a.name,b.id
go
/*
id name id
----------- -------------------------------------------------- ----------- -----------
1 《学习123》 1 1
1 《学习123》 2 2
1 《学习123》 3 3
1 《学习123》 4 4
2 《学习456》 1 1
2 《学习456》 2 2
2 《学习456》 3 3
2 《学习456》 4 4
3 《学习789》 1 1
3 《学习789》 2 2
3 《学习789》 3 3
3 《学习789》 4 4(所影响的行数为 12 行)id name id
----------- -------------------------------------------------- ----------- -----------
1 《学习123》 1 1
2 《学习456》 2 2
3 《学习789》 3 3(所影响的行数为 3 行)*/
(select d.e from (select a.id e) d),子查询语句是不完整的,你这里 a.id 是指什么?当前查询的 a 表的 id?
a.id就查不到了。如SQL:select a.id,a.name,(select b.a from (select b.id a) b),b.id from
(
select 1 id,'《学习123》' name
union
select 2 id,'《学习456》' name
union
select 3 id,'《学习789》' name
union
select 4 id,'《学习abc》' name
) a
,
(
select 1 id,1 aid,'A书架' add1
union
select 2 id,2 aid,'B书架' add1
union
select 3 id,3 aid,'C书架' add1
union
select 4 id,3 aid,'D书架' add1
) b
,
(
select 1 id,1 bid,'张三' uname
union
select 2 id,2 bid,'李四' uname
union
select 3 id,3 bid,'马六' uname
union
select 4 id,3 bid,'张三' uname
) c
where a.id=b.aid and b.id=c.bid group by a.id,a.name,b.id
什么意思呢?有点没懂。
你试一下 上面那个SQL嘛。会说服务器: 消息 207,级别 16,状态 3,行 1
列名 'id' 无效。但是如果写这样的SQL,就是正常的,两个的区别 也仅仅是那个子查询。select a.id,a.name,(select b.id),b.id from
(
select 1 id,'《学习123》' name
union
select 2 id,'《学习456》' name
union
select 3 id,'《学习789》' name
union
select 4 id,'《学习abc》' name
) a
,
(
select 1 id,1 aid,'A书架' add1
union
select 2 id,2 aid,'B书架' add1
union
select 3 id,3 aid,'C书架' add1
union
select 4 id,3 aid,'D书架' add1
) b
,
(
select 1 id,1 bid,'张三' uname
union
select 2 id,2 bid,'李四' uname
union
select 3 id,3 bid,'马六' uname
union
select 4 id,3 bid,'张三' uname
) c
where a.id=b.aid and b.id=c.bid group by a.id,a.name,b.id