有两张表A和B,A是人员基本信息,B人员报酬信息,两张表通过id关联,B中的记录只与A中的一部分记录对应,即A中有一部分记录在B中没有对应的记录,现在要基于A和B创建一个视图,这个视图包含A、B的所有列、所有记录,如果A中的记录在B中没有对应的记录,则sal显示为null,注意不能用左、右连接等实现,SQL尽量简单、不用过多嵌套查询。这是我实际工作中简化后的模型,实际情况是有8张表,1张主表,7张从表,每张表都对应主表的一部分记录。
A(
id varchar2(18),
per_sex char(1),
per_name varchar2(200)
)B(
id varchar2(18),
sal varchar2(10)
)

解决方案 »

  1.   


    select A.*,B.sal from A,B where a.ID=b.ID
    union all
    select A.*,NULL  from A where not exists(select * from B where ID=A.ID)
      

  2.   

    感谢楼上作答,因为我有8张表关联的,每张表数据量都在200W以上,不知道有没有不用子查询的办法?
    比如
    create view V_AB
    (
     id,per_sex,sal
    )
    select 
     id,per_sex,(select sal from B where b.id = id  我想知道此处有没有什么机制能够把A表当前记录的id传过来啊?)
    from A
      

  3.   

      考虑到实际的应用,用+还是比较好的方式,这就是oracle为什么设计+的原因。
      当再加上条件查询的时候,有的可能可以转化为index scan ,这样最终还不算太慢。 
    除了这个就是修改数据结构,恐怕不行的。