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)
);
怎么改写那条sql语句呢
情况是这样的 之前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
唉头都想破了 不清楚为什么...
大侠给我解决下吧 ,那些建表语句都在上面的帖子里
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里面的写法
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);
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
还有问题啊 我需要根据特定的parterid 判断啊 你这样写就只把 所有的不存在对应关系的除掉 如果我有另外一个parterid 存在着这中对应关系,只要这个parterid不是我where要求的那个 也应该查出来对应的物品啊
就那几个表 没有别的了,我现在就是需要根据 我特定的parterid 查询出 和这个parterid在tb_pro_relation 中不存在对应关系的 所有物品信息
不存在对应关系的意思就是找出 tb_pro_goods 中的goodsid的值 在tb_pro_relation 中goodsid的那个字段没有的值,还有 即使存在两个表的goodsid值相等 可这个值所在的那一条记录里的 vsparterid 和 那传入的那个特定的parterid 不相等的 这两种都叫做没有对应关系
不知道你可明白了有点乱哈
LEFT JOIN tb_pro_parter c ON b.vsparterid =c.parterid
WHERE b.goodsid IS NULL or c.parterid IS null将AND->OR 即可