表A 主码为 产品(xh) 日期(rq)表B为 主码为 产品(xh) 日期(rq)其中,表B为A的一个子集怎么才能把 A 不包括 B 的那部分数据列出来,交集好弄,补集怎么写sql

解决方案 »

  1.   

    如果是主key的话,这样就应该可以了
    select * from A,B
    where A.xh != B.xh and A.rq != B.rq
      

  2.   

    或者
    select * from (
    select xh,rq from A minus select select xh,rq from B
    )
      

  3.   

    或者
    select xh,rq from A,B
    where A.xh = B.xh(+) and A.rq=B.rq(+) and B.xh is null and B.rq is null
      

  4.   

    select A.* from A,B
    where A.xh != B.xh and A.rq != B.rq--其他的应该也是OK的啊?怎么会选出交集呢?你把数据贴出来我看下!
    --你用这个sql再试下
    [code=SQL]select A.xh,A.rq,B.xh,B.rq from A,B
    where A.xh = B.xh(+) and A.rq=B.rq(+) and B.xh is null and B.rq is null
    [/code]
      

  5.   

    这哪是补集啊,这是差集啊(A-B)。
    实测数据:CREATE TABLE T150
    (
        xh NUMBER(2),
        rq DATE
    );INSERT INTO T150 VALUES(0, to_date('2012-02-27', 'YYYY-MM-DD'));
    INSERT INTO T150 VALUES(0, to_date('2012-02-28', 'YYYY-MM-DD'));
    INSERT INTO T150 VALUES(0, to_date('2012-02-29', 'YYYY-MM-DD'));INSERT INTO T150 VALUES(1, to_date('2012-03-01', 'YYYY-MM-DD'));
    INSERT INTO T150 VALUES(1, to_date('2012-03-02', 'YYYY-MM-DD'));
    INSERT INTO T150 VALUES(1, to_date('2012-03-03', 'YYYY-MM-DD'));INSERT INTO T150 VALUES(2, to_date('2012-03-06', 'YYYY-MM-DD'));
    INSERT INTO T150 VALUES(2, to_date('2012-03-07', 'YYYY-MM-DD'));
    INSERT INTO T150 VALUES(2, to_date('2012-03-08', 'YYYY-MM-DD'));INSERT INTO T150 VALUES(3, to_date('2012-03-10', 'YYYY-MM-DD'));
    INSERT INTO T150 VALUES(3, to_date('2012-03-11', 'YYYY-MM-DD'));
    INSERT INTO T150 VALUES(3, to_date('2012-03-12', 'YYYY-MM-DD'));CREATE TABLE T151
    (
        xh NUMBER(2),
        rq DATE
    );-- T151中的数据是典型的,(1条未取,取1条,取2条,全取)
    INSERT INTO T151 VALUES(1, to_date('2012-03-01', 'YYYY-MM-DD'));INSERT INTO T151 VALUES(2, to_date('2012-03-06', 'YYYY-MM-DD'));
    INSERT INTO T151 VALUES(2, to_date('2012-03-07', 'YYYY-MM-DD'));INSERT INTO T151 VALUES(3, to_date('2012-03-10', 'YYYY-MM-DD'));
    INSERT INTO T151 VALUES(3, to_date('2012-03-11', 'YYYY-MM-DD'));
    INSERT INTO T151 VALUES(3, to_date('2012-03-12', 'YYYY-MM-DD'));
    实测结果:
      

  6.   

    select * from a where (xh,rq) not in(select xh,rq from b)这样好像也行
      

  7.   

    当然也可以 只不过in的效率相对比较低
    可以用exists来代替