表A       表B
text      KK
甲          1
乙          2
            3
select * from A,B  为
甲 1
乙 1
甲 2
乙 2
甲 3
乙 3select * from B,A 为
1 甲
1 乙
2 甲
2 乙
3 甲
3 乙我觉得 select * from B,A 为
1    甲
2    乙
3    甲
1    乙
2    甲
3    乙
才对.
究竟 select * from B,A 他们发生了什么情况呢?还有的是 .select 是怎样查询的?  是 select 先?还是 from 先?我怎样都找不到这方面的知识.
谢谢了.

解决方案 »

  1.   

    declare @a table(x nvarchar(10))
    insert into @a 
    select N'甲'
    union all select N'乙'declare @b table(kk int)
    insert into @b 
    select 1 union all select 2 union all select 3select * from @a ,@b
    /*
    x          kk
    ---------- -----------
    甲          1
    乙          1
    甲          2
    乙          2
    甲          3
    乙          3
    */
    select * from @b, @a
    /*
    kk          x
    ----------- ----------
    1           甲
    2           甲
    3           甲
    1           乙
    2           乙
    3           乙*/
    select @@version
    /*--------------------------------------------------------
    Microsoft SQL Server 2005 - 9.00.3159.00 (Intel X86) 
    Mar 23 2007 16:15:11 
    Copyright (c) 1988-2005 Microsoft Corporation
    Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
    (1 row(s) affected)*/
      

  2.   

    LZ的A表肯定有设主键或索引
    给实际例子declare @a table(data varchar(2))
    declare @b table(data int)
    insert into @a
    select '甲'
    union select '乙'
    insert into @b
    select 1
    union select 2
    union select 3
    select * from @a,@b
    select * from @b,@adata data        
    ---- ----------- 
    甲    1
    乙    1
    甲    2
    乙    2
    甲    3
    乙    3
    data        data 
    ----------- ---- 
    1           甲
    2           甲
    3           甲
    1           乙
    2           乙
    3           乙declare @a table(data varchar(2) primary key)
    declare @b table(data int)
    insert into @a
    select '甲'
    union select '乙'
    insert into @b
    select 1
    union select 2
    union select 3
    select * from @a,@b
    select * from @b,@adata data        
    ---- ----------- 
    甲    1
    乙    1
    甲    2
    乙    2
    甲    3
    乙    3
    data        data 
    ----------- ---- 
    1           甲
    1           乙
    2           甲
    2           乙
    3           甲
    3           乙
      

  3.   

    create table #1(a nchar)
    create table #2(b int)
    insert into #1 values('次')
    insert into #1 values('亜')
    insert into #2 select 1
    union all select 2
    union all select 3select * from #1,#2 
    a b
    次 1
    亜 1
    次 2
    亜 2
    次 3
    亜 3
    select * from #2,#1
    b a
    1 次
    1 亜
    2 次
    2 亜
    3 次
    3 亜select * from #1,#2 order by b,a
    a b
    亜 1
    次 1
    亜 2
    次 2
    亜 3
    次 3select * from #2,#1 order by b,a
    b a
    1 亜
    1 次
    2 亜
    2 次
    3 亜
    3 次select * from #1,#2 order by a,b
    a b
    亜 1
    亜 2
    亜 3
    次 1
    次 2
    次 3select * from #2,#1 order by a,b
    b a
    1 亜
    2 亜
    3 亜
    1 次
    2 次
    3 次
      

  4.   

    select * from A,B
    结果
    甲    1
    乙    1
    甲    2
    乙    2
    甲    3
    乙    3没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小.
    这样理解输出结果
    (1)逐行扫描表A的中的每条记录
    (2)对于表A的每条记录,逐行扫描表B的每条记录
    (3)将表A的当前扫描行和表B的当前扫描行添加到记录集中
    (4)继续扫描表B的下一行,重复(3),(4),直到扫描完表B的所有记录
    (5)继续继续扫描表A的下一行,重复(2),(5),直到扫描完表A的所有记录
    select * from B,A则先扫描表B
    结果
    1           甲
    1           乙
    2           甲
    2           乙
    3           甲
    3           乙
      

  5.   

    select * from A,B你的明白?select * from B,A
    (1)扫描B表第一行得到1
    (2)对于B中KK=1扫描依次扫描A中的所有记录得到
    1          甲 
    1          乙
    (3)再扫描B的下一行,针对下一行再扫面A所有记录
    ...
    按照我上面写的自己多琢磨琢磨就懂了,很简单的
      

  6.   

    select * from B,A 为 
    1 甲 
    1 乙 
    2 甲 
    2 乙 
    3 甲 
    3 乙 我觉得 select * from B,A 为 
    1    甲 
    2    乙 
    3    甲 
    1    乙 
    2    甲 
    3    乙 
    才对. 
    究竟 select * from B,A 他们发生了什么情况呢? 应该先B表查出1然后连接A表所有字段 甲乙  然后在查2然后甲乙 所以你看到的是1 甲 
    1 乙 
    2 甲 
    2 乙 
    3 甲 
    3 乙 
      

  7.   

    恩,为啥select * from A,B 的结果不是这个顺序呢?谢谢.
      

  8.   

    审题错误,原来以为LZ只是因为粗心忘了A表有主键,认真看一下才知道LZ对表关联基本规则存在疑问做个比喻,小时候学Basic做99乘法的题目,你肯定会设i、j两个变量,做双重循环,循环一次j+1,如果j超过9了,回复1,i再加一——但你不会去写个程序,循环一次i,j都加一,然后去判断i和j是否超过9,超过了再回复1,直到循环81次结束(这样算结果还是错的,LZ臆想的情况没错,仅仅是因为2<>3,且2和3是质因数……)……
      

  9.   

    select * from A,B
    text      KK 
    甲          1 
    乙          2 
                3 
    (1)扫描A表第一行得到'甲'
    (2)对于A中text = '甲',依次扫描B中的所有记录得到 
    甲    1 
    甲    2 
    甲    3 
     (3)再扫描A的下一行,针对下一行再扫面B所有记录
    .....
      

  10.   

    哦.应该是交叉连接了.我那个是.跟 cross join 一样的.