本帖最后由 cklxh520 于 2011-10-14 11:42:02 编辑

解决方案 »

  1.   

    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 行受影响)*/
      

  2.   

    我也奇怪为什么是一样的 楼主你 的SQL什么版本?
      

  3.   

    在我这,SQL1,执行出来是一堆的记录,SQL2和你的是一样的。
    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
      

  4.   

    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 行受影响)*/
      

  5.   

    你们是什么版本的?
    我和我一同事上,都是sqlserver2000,都是这样的结果。没有其它版本的sqlserver,所以没测试到。
      

  6.   

    哎,看来该升级咯。莫非这是sqlserver2000的 特殊功能?
      

  7.   

    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
    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 行)*/
      

  8.   

    呵呵,很好奇,为什么sqlserver2000 要做出这个样子,,难道是为了 满足 某种情况下的需要?到底是哪种情况呢?
      

  9.   

    这种写法是有问题的:
    (select d.e from (select a.id e) d),子查询语句是不完整的,你这里 a.id 是指什么?当前查询的 a 表的 id?
      

  10.   

    我也认为这样写是不对的,但是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
      

  11.   

    select 1 id union select 2 id这是把1,2,当成别名ID了.
      

  12.   

    如果严格地按照 inner join 的写法,你的查询语句是错的.
      

  13.   


    什么意思呢?有点没懂。
    你试一下 上面那个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