desc tb_pro_relation;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| relationid   | varchar(20) | NO   | PRI | NULL    |       |
| goodsid      | varchar(20) | YES  |     | NULL    |       |
| vsparterid   | varchar(20) | YES  |     | NULL    |       |
| relationtype | varchar(2)  | YES  |     | NULL    |       |
| optsn        | varchar(20) | YES  |     | NULL    |       |
| sessionid    | varchar(20) | YES  |     | NULL    |       |
| optuserid    | varchar(20) | YES  |     | NULL    |       |
| optdate      | varchar(20) | YES  |     | NULL    |       |
| re       | text        | YES  |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+desc tb_pro_parter;
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| parterid   | varchar(20)  | NO   | PRI | NULL    |       |
| partername | varchar(100) | YES  |     | NULL    |       |
| partertype | varchar(2)   | YES  |     | NULL    |       |
| address    | varchar(100) | YES  |     | NULL    |       |
| connectno  | varchar(20)  | YES  |     | NULL    |       |
| optsn      | varchar(20)  | YES  |     | NULL    |       |
| sessionid  | varchar(20)  | YES  |     | NULL    |       |
| optuserid  | varchar(20)  | YES  |     | NULL    |       |
| optdate    | varchar(20)  | YES  |     | NULL    |       |
| re     | text         | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+desc tb_pro_goods;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| goodsid   | varchar(20) | NO   | PRI | NULL    |       |
| goodsname | varchar(20) | YES  |     | NULL    |       |
| optsn     | varchar(20) | YES  |     | NULL    |       |
| sessionid | varchar(20) | YES  |     | NULL    |       |
| optuserid | varchar(20) | YES  |     | NULL    |       |
| optdate   | varchar(20) | YES  |     | NULL    |       |
| re    | text        | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+我现在碰到的问题是这样的 上面三张表分别是 伙伴和物品对应关系表 ,伙伴表 ,物品表 我现在想通过一个给定的parterid 查询出和这个parterid没有对应关系的物品,我的sql语句是这样写的:SELECT distinct  a.goodsid,a.goodsname FROM tb_pro_goods a, tb_pro_relation b ,tb_pro_parter c  where !(a.goodsid =b.goodsid AND b.vsparterid =c.parterid) and c.parterid='PT2010060902'
当 tb_pro_relation 表没有任何数据时 这个查询取不到数据 当我给这个表插入一条数据后再执行语句 这条语句能达到我想要的结果
想问问哪位大侠能帮我解决:
下面是建表语句:/*==============================================================*/
/* Table: tb_pro_goods                                          */
/*==============================================================*/
create table tb_pro_goods
(
   goodsid              varchar(20) not null,
   goodsname            varchar(20),
   goodstype            varchar(20),
   inventcounts         varchar(20),
   optsn                varchar(20),
   sessionid            varchar(20),
   optuserid            varchar(20),
   optdate              varchar(20),
   re               text
);/*==============================================================*/
/* Table: tb_pro_parter                                         */
/*==============================================================*/
create table tb_pro_parter
(
   parterid             varchar(20) not null,
   partername           varchar(100),
   partertype           varchar(2),
   address              varchar(100),
   connectno            varchar(20),
   optsn                varchar(20),
   sessionid            varchar(20),
   optuserid            varchar(20),
   optdate              varchar(20),
   re               text,
   primary key (parterid)
);/*==============================================================*/
/* Table: tb_pro_relation                                       */
/*==============================================================*/
create table tb_pro_relation
(
   relationid           varchar(20) not null,
   goodsid              varchar(20),
   vsparterid           varchar(20),
   relationtype         varchar(2),
   optsn                varchar(20),
   sessionid            varchar(20),
   optuserid            varchar(20),
   optdate              varchar(20),
   re               text,
   primary key (relationid)
);

解决方案 »

  1.   

    那么能不能在没有记录的时候也可以实现我要的功能呢 
    怎么改写那条sql语句呢
      

  2.   

    你将内连接修改为外连接(LEFT JOIN),试试
      

  3.   

    使用LEFT JOIN 或者说RIGHT JOIN
      

  4.   

    现在碰到个新问题 查询出来的数据不对 不是我想要的数据
    情况是这样的 之前tb_pro_goods a 表里面有2条数据 有一条已经和 tb_pro_parter c在tb_pro_relation b中建立了对应关系 现在我又向tb_pro_goods a中添加了2条数据,就是说这个表有四条数据,然后把其中另一条和 tb_pro_parter c在tb_pro_relation b中也建立了对应关系,
    现在问题出来了 :
    我查询和tb_pro_parter c中的那个特定的parterid 在tb_pro_relation b中也建立了对应关系的tb_pro_goods a中的数据 是两条这是正常的,可是当我查询没有和这个id建立对应关系的tb_pro_goods a中的数据时 居然变成了4条!应该也是两条才对啊,不知道要怎么修改sql语句 我修改了好几次都没有用
    SELECT distinct  a.goodsid,a.goodsname FROM tb_pro_goods a, tb_pro_relation b ,tb_pro_parter c 
     where !(a.goodsid =b.goodsid AND b.vsparterid =c.parterid ) and c.parterid=? ORDER BY a.goodsid还有用join形式的select distinct a.goodsid,a.goodsname from tb_pro_goods a left join (tb_pro_relation b CROSS JOIN tb_pro_parter c) ON ((a.goodsid =b.goodsid and b.vsparterid !=c.parterid) or (a.goodsid!=b.goodsid))
    where c.parterid='PT2010060901'
    真不知道该怎么办了 为什么当初 a 表记录是两条时是正常的
    下面是 查询的各表的数据:mysql> select goodsid,goodsname from tb_pro_goods ;
    +--------------+--------------+
    | goodsid      | goodsname    |
    +--------------+--------------+
    | PG2010060903 | 立白洗衣粉   |
    | PG2010060904 | 金龙鱼食用油 |
    | PG2010061101 | 奇强肥皂     |
    | PG2010061102 | 雕牌洗洁精   |
    +--------------+--------------+
    4 rows in set
    mysql> select parterid,partername from tb_pro_parter;
    +--------------+------------------+
    | parterid     | partername       |
    +--------------+------------------+
    | PT2010060901 | 立白经销商       |
    | PT2010060902 | 金龙鱼淮南代理商 |
    +--------------+------------------+
    2 rows in setmysql> select relationid,goodsid,vsparterid from tb_pro_relation;
    +------------------+--------------+--------------+
    | relationid       | goodsid      | vsparterid   |
    +------------------+--------------+--------------+
    | RL2010060901     | PG2010060903 | PT2010060901 |
    | RL10060000000103 | PG2010060904 | PT2010060901 |
    +------------------+--------------+--------------+
    2 rows in set
    唉头都想破了 不清楚为什么...
    大侠给我解决下吧 ,那些建表语句都在上面的帖子里
      

  5.   

    INSERT 语句也贴出来,有了数据才好测试
      

  6.   

    Quote=引用 6 楼 wwwwb 的回复:]
    INSERT 语句也贴出来,有了数据才好测试
    [/Quote]
    没有写 我直接在表里面添加的记录测试的只有一个 给tb_pro_goods a, tb_pro_parter c两张表在 tb_pro_relation b 表建立关系的语句INSERT INTO tb_pro_relation(relationid,goodsid,vsparterid,relationtype,optsn,sessionid,optuserid,optdate)
     VALUES(sp_genseqfunc('L','R'),?,?,?,sp_genseqfunc('L','R'),?,?,now())这是java里面的写法
      

  7.   

    MYSQLDUMP将三表导出来,再贴,呵呵,不想建立环境了
      

  8.   

    INSERT INTO `tb_pro_relation` VALUES ('RL2010060901', 'PG2010060903', 'PT2010060901', '1', null, null, null, null, null);
    INSERT INTO `tb_pro_relation` VALUES ('RL2010060902', 'PG2010060904', 'PT2010060901', '1', null, null, null, null, null);
    -- ----------------------------
    -- Records 
    -- ----------------------------INSERT INTO `tb_pro_parter` VALUES ('PT2010060901', '立白经销商', '0', '淮南八公山', '13605588765', null, null, null, null, null);
    INSERT INTO `tb_pro_parter` VALUES ('PT2010060902', '金龙鱼淮南代理商', '1', '淮南宾馆斜对面', '13504535425', null, null, null, null, null);
    -- ----------------------------
    -- Records 
    -- ----------------------------
    INSERT INTO `tb_pro_goods` VALUES ('PG2010060903', '立白洗衣粉', null, null, null, null, null);
    INSERT INTO `tb_pro_goods` VALUES ('PG2010060904', '金龙鱼食用油', null, null, null, null, null);
    INSERT INTO `tb_pro_goods` VALUES ('PG2010061101', '奇强肥皂', null, null, null, null, null);
    INSERT INTO `tb_pro_goods` VALUES ('PG2010061102', '雕牌洗洁精', null, null, null, null, null);
      

  9.   

    结果 是什么?
    PG2010061101
    PG2010061102SELECT * FROM tb_pro_goods a LEFT JOIN tb_pro_relation b ON a.goodsid =b.goodsid
    LEFT JOIN tb_pro_parter c ON  b.vsparterid =c.parterid
    WHERE b.goodsid IS NULL AND c.parterid IS null
      

  10.   


    还有问题啊 我需要根据特定的parterid 判断啊 你这样写就只把 所有的不存在对应关系的除掉 如果我有另外一个parterid 存在着这中对应关系,只要这个parterid不是我where要求的那个 也应该查出来对应的物品啊
      

  11.   

    贴记录容易理解一些,INSERT 语句
      

  12.   


    就那几个表 没有别的了,我现在就是需要根据 我特定的parterid 查询出 和这个parterid在tb_pro_relation 中不存在对应关系的 所有物品信息
    不存在对应关系的意思就是找出 tb_pro_goods 中的goodsid的值 在tb_pro_relation 中goodsid的那个字段没有的值,还有 即使存在两个表的goodsid值相等 可这个值所在的那一条记录里的 vsparterid 和 那传入的那个特定的parterid 不相等的 这两种都叫做没有对应关系
    不知道你可明白了有点乱哈
      

  13.   

    SELECT * FROM tb_pro_goods a LEFT JOIN tb_pro_relation b ON a.goodsid =b.goodsid
    LEFT JOIN tb_pro_parter c ON b.vsparterid =c.parterid
    WHERE b.goodsid IS NULL or c.parterid IS null将AND->OR 即可
      

  14.   

    c.parterid IS null 修改成 c.parterid!='PT2010060901' 就是我想要的结果了 谢谢!加分了