a表有10行记录 b表没有记录,c表select * from a, b, c;查询结果为0条记录为什么呢? 默认不是做笛卡尔乘积吗  应该有10条记录才对啊如果要返回10条记录应该怎么做呢

解决方案 »

  1.   

    笛卡尔积的结果就是0条,用公式表示的话,笛卡尔积的结果数目=count(a) * count(b) * count(c)
      

  2.   

    第二个问题,去学习一下left join / right join / full outer join
      

  3.   

    查了笛卡尔乘积的定义 原来是不包含空值元素的笛卡尔(Descartes)乘积又叫直积。设A、B是任意两个集合,在集合A中任意取一个元素x,在集合B中任意取一个元素y,组成一个有序对(x,y),把这样的有序对作为新的元素,他们的全体组成的集合称为集合A和集合B的直积,记为A×B,即A×B={(x,y)|x∈A且y∈B}。
      

  4.   


    笛卡尔积的时候,如果有null集合,那么结果为null。
      

  5.   


    谢谢你的建议 不过不适合我的题目我这里想问的是
    select * from a, b, c
    这样的语句如何修改保证在表为空时不会丢失记录这里问的是笛卡尔乘积的情况 不是连接的情况
      

  6.   

    本帖最后由 inthirties 于 2009-11-18 21:44:16 编辑
      

  7.   


    晕菜了,,,null就是你要的结果~~~~
      

  8.   

    呵呵 楼主你需要仔细想想 
    你自己已经和自己矛盾了你想要的是笛卡尔积 可是笛卡尔积出来的结果就是NULL 前面实验也已经证实了这一点
    而你的需求是返回10条记录 
    那么这就需要通过外连接来实现 而不是笛卡尔积你想吃鸭肉 可你手上只有一只鸡
    总不能指着一只鸡说我就要吃鸭肉吧?!
      

  9.   

    我现在是拿着一只鸭,但是那只鸭没熟,来请教一下怎么把它煮熟了==================我现在的需求是想要获得三(N)个表的笛卡尔乘积但是当这些个表中有空表的时候我又需要把其它有记录的表中的记录显示出来全连接出来不是我想要的左外连接只有在表为空时才会得出我想要的结果A
    ID NUM
    -- --
    1 1
    2 2
    3 3B
    ID NUM
    -- --
    1 1
    2 2
    3 3=====================
    select * from aa, bb;
    ID NUM ID NUM
    -- --- -- ---
    3  3   3  3  
    3  3   4  4  
    3  3   1  1  
    3  3   2  2  
    4  4   3  3  
    4  4   4  4  
    4  4   1  1  
    4  4   2  2  
    1  1   3  3  
    1  1   4  4  
    ---------------- 10 --------------
    1  1   1  1  
    1  1   2  2  
    2  2   3  3  
    2  2   4  4  
    2  2   1  1  
    2  2   2  2  ---------------左外连接------------------select * from aa, bb where aa.id = bb.id (+);ID NUM ID NUM
    -- --- -- ---
    3  3   3  3  
    4  4   4  4  
    1  1   1  1  
    2  2   2  2  4 rows selected.
    ----------------全连接-------------------
    select * from aa full outer join bb on aa.id = bb.id;ID NUM ID NUM
    -- --- -- ---
    3  3   3  3  
    4  4   4  4  
    1  1   1  1  
    2  2   2  2  
      

  10.   

    保证要连接的表非空就可以了
    比如
    将c表改成
    (select * from 
      (select * from c union all select null,null,null... from dual order by 1)
    where col1 is not null or rownum=1)c
      

  11.   

    用select * from a, b, c; 这样用','相当于隐式的inner join 应该是不会有记录的