declare @a table(a int,b int)
declare @b table(a int,b int)
insert @a values(1,1)
insert @a values(2,2)
insert @b values(1,1)
insert @b values(3,3)--左:
select * from @a Aa left join @b Bb on Aa.a=Bb.a
--右:
select * from @a Aa right join @b Bb on Aa.a=Bb.a
--内
select * from @a Aa join @b Bb on Aa.a=Bb.a
--外
select * from @a Aa full join @b Bb on Aa.a=Bb.a
--完全(笛卡尔乘积)
select * from @a,@b

解决方案 »

  1.   

    笛卡尔乘积不可避免,要不就不叫关系型数据库
    多表查询:
    select a.*,b.x from a,b
    where a.id=b.id
    ....
      

  2.   

    学生表    (学号,姓名,年龄,性别...)
    成绩表    (学号,语文成绩,数学成绩,化学成绩...)select 学生表.学号,学生表.姓名,学生表.性别,成绩表.语文成绩,学生表.数学成绩,学生表.化学成绩...
    from 学生表,成绩表
    where 学生表.学号=成绩表.学号
    这样子写比较麻烦,改用表别名后写成:select a.学号,a.姓名,a.性别,b.语文成绩,b.数学成绩,b.化学成绩
    from 学生表 a,成绩表 b
    where a.学号=b.学号也可成写:
    select a.学号,a.姓名,a.性别,b.语文成绩,b.数学成绩,b.化学成绩
    from 学生表 a inner join 成绩表 b
    on a.学号=b.学号刚开始掌握内联结的方法就可以了,当然一般用英文字段,这里是举例,以求好懂。当然企业管理器也可以实现,但它不是很灵活,一般使用查询管理器.企业管理器里打开一个表后,点击工具栏上的SQL按钮,就可以写SQL 语句了。
      

  3.   

    不好意思,第一条语句有笔误。应该是:
    select 学生表.学号,学生表.姓名,学生表.性别,成绩表.语文成绩,成绩表.数学成绩,成绩表.化学成绩...
    from 学生表,成绩表
    where 学生表.学号=成绩表.学号
      

  4.   

    是不是必须要在WHERE语句里进行控制啊?这么控制的原理何在啊?
      

  5.   

    是要从where 中进行控制,以从笛卡积中找出我们需要的结果,当然有时为了控制结果也有不用where 子句的,但不多见。
    student 表:
    Name       Gender
    dummy1     F
    dummy2     T
    Grade  表:
    Name      Grade
    dummy1    A
    dummy2    Bselect student.name,student.gender,grade.name,grade.grade
    from student,grade结果如下:
    Name    gender     Name   Grade        
    dummy1 F dummy1 A
    dummy2 T dummy1 A
    dummy1 F dummy2 B
    dummy2 T dummy2 B这是笛卡乐积的结果,显然第二条和第三条结果不是我们想要的。可以改成
    select student.name,student.gender,grade.name,grade.grade
    from student,grade
    where student.name=grade.name
    结果为:
    Name    gender     Name   Grade        
    dummy1 F dummy1 A
    dummy2 T dummy2 B