首页 新闻 会员 周边

求个SQL语句的写法,多谢

0
悬赏园豆:5 [已解决问题] 解决于 2014-11-11 17:22

表A   字段A1  A2  A3

表B    字段B1 A2  A3

关联关系同字段定义:A2、A3(A2和A3字段是多对多关系),

一般我们写的多的是A表一个字段在B表中不存在的记录,我现在要求A表中两个字段(A2、A3)在B表中不存在,不知道是否描述清楚,多谢:

问题补充:

实际业务再说明下:

A表 是ID,合同ID,合同下面挂接项目ID,B表是项目的金额审减表,所以是 ID,合同ID,项目ID,审减值,(为什么加合同ID,是因为项目和合同多对多),我就是想找出A表中项目没有审减的记录,即合同ID,项目ID在审减表B中没有记录的结果集

风醉的主页 风醉 | 小虾三级 | 园豆:1197
提问于:2014-11-11 11:43
< >
分享
最佳答案
1
select A.Project_ID from A,B
 where A.Contract_ID = B.Contract_ID
   and A.Project_ID  <> B.Project_ID  


怎么会写出来这么简单,可能是我理解错了,对于你说的A表中的项目没有审减值,并且两个表合同ID要对上,那如果合同对应上了,说明查出来的记录是该合同下的所有项目ID,使用A.Project_ID  <> B.Project_ID 就可以挑选出A表中的项目不存在B表中的记录了。

收获园豆:5
LgV5 | 菜鸟二级 |园豆:221 | 2014-11-11 14:15

首长你的回答给了我思路,虽然我执行下,SQL直接死掉了,原因是 A表和B表没有关联关系,合同和项目也是多对多关系,所以这样查询出来的,就是合同号对上了,然后所有的关联项目和结算记录做排列组合显示,

其实我要的很简单,一般我们是A表一个字段在B表中不存在,我现在要求A表中两个字段组合在B表中不存在

风醉 | 园豆:1197 (小虾三级) | 2014-11-11 14:29

@风醉: 不知道你用的是Oracle还是MSSQl,前者的不等于好像是用!=,后者是<>,尽量少用not in,使用not exist,然后你说的如果合同号对上了,确实查询结果就是《所有的关联项目和结算记录做排列组合显示》那么有了这个结果集,你就可以去筛选那些没有结算记录的项目了,至于后面的A表中的两个字段组合在B中不存在,那么可以用下面的语句

select A.ID,A.Contract_ID,A.Project_ID from A M 
where not exists
  (select A.ID from A,B    where A.Contract_ID = B.Contract_ID     and a.Project_ID = B.Project_ID     and M.ID = A.ID )

试试看吧,解释下,语句,首先就是查询出A中两个字段组合与B表两个字段组合一致的记录,既然你想要的是组合不在B表,那么我只需要在A表中剔除掉这些存在的记录,那么剩下记录,不就是要么Contract_ID不存在B表,或者Project_ID不存在B表,要么都不存在吗?这样查询出来的结果就是你想要的组合不在B表了

LgV5 | 园豆:221 (菜鸟二级) | 2014-11-11 15:05

@车上有首长: TKS,经测试可用,个人思维确实转不过弯,难道人老了

风醉 | 园豆:1197 (小虾三级) | 2014-11-11 17:24

@车上有首长:  另贴上我实际测试的代码和结果

select * from (
select M.project_no,M.contract_no,M.contract_rateFee,M.contract_rateFee_last from tb_contract2project M where not exists (

  select A.rec_no from  tb_contract2project A,vw_contract_change_items B
  where A.contract_no=B.contract_no
  and A.project_no=B.project_no
  and M.rec_no=A.rec_no
)

 and contract_rateFee_last is not null
 ) A left join vw_contract_change_items B on A.contract_no=B.contract_no and A.project_no=B.project_no

风醉 | 园豆:1197 (小虾三级) | 2014-11-11 17:27
其他回答(6)
0

A2和A3哪个就父ID  A1和B1也是1对多人关系?

我系你们大表哥 | 园豆:207 (菜鸟二级) | 2014-11-11 12:34

A1和B1 就是个ID,没啥关系

支持(0) 反对(0) 风醉 | 园豆:1197 (小虾三级) | 2014-11-11 13:46

 的 表确实设计得有点复杂了,不过数据量不大,不考虑性能的话,还是可以用not in 子查询实现。

——

支持(0) 反对(0) 我系你们大表哥 | 园豆:207 (菜鸟二级) | 2014-11-11 13:55

@风醉: select A1 ,A2,A3 from A表
where A3 not in (select A3 from b表)
试试看查出来是你要的数据不?

——

支持(0) 反对(0) 我系你们大表哥 | 园豆:207 (菜鸟二级) | 2014-11-11 13:58

@温柔✿殺手: 少了个前提, 你这是查出A表中A3不在B表的情况,没包含我想要的 A2要对应下,即同一条记录, A表中的A2、A3 和B表中的A2、A3 一样才排除 

支持(0) 反对(0) 风醉 | 园豆:1197 (小虾三级) | 2014-11-11 14:02

@风醉: 你怎么不开窍呢?你是要统计项目的金额撒? 同一个项目会有不同的合同吗?如果是,再套一个查询,将刚才查的结果生成一张临时表 where A2 not in(select A2 from b表)

支持(0) 反对(0) 我系你们大表哥 | 园豆:207 (菜鸟二级) | 2014-11-11 14:06

@温柔✿殺手: 呵呵,同一个项目会有不同的合同,但是你这思路有点小问题,首先你第一个排除已经筛选了可能正确的数据,即 比方说 A中  有  ID:1 A2:合同1  A3 项目1   B中  有 ID:1  A2:合同2 A3 项目1

,你第一个SQL,已经筛选掉了 A中的这个数据,实际这条数据是我要的,除非 B中有 ID:X  A2:合同1  A3 项目1,不知道是否说清楚了

支持(0) 反对(0) 风醉 | 园豆:1197 (小虾三级) | 2014-11-11 14:20

@风醉: 这表谁设计的啊,太难受了,你这样吧,将两表用left join联查。

select a.*,b.* from A表,B表 where a.a1<>b.a1 or a.a21<>b.a2试试

支持(0) 反对(0) 我系你们大表哥 | 园豆:207 (菜鸟二级) | 2014-11-11 14:29

@温柔✿殺手: 实际业务要求, 合同挂接项目表,合同结算表,项目结算表,涉及到财务是这样的,设计也是和市面上金蝶这种一样的,谢谢回答,但是你这样级联确实没能达到这种效果,我更改了问题的描述,麻烦看下,这样写应该很容易懂了

 

支持(0) 反对(0) 风醉 | 园豆:1197 (小虾三级) | 2014-11-11 14:38

@风醉: 你的业务我明白了,介意把这两张表导出sql 带几条数据的,我来查查。

支持(0) 反对(0) 我系你们大表哥 | 园豆:207 (菜鸟二级) | 2014-11-11 14:57

136542892@qq.com 发这里来

支持(0) 反对(0) 我系你们大表哥 | 园豆:207 (菜鸟二级) | 2014-11-11 14:57

@温柔✿殺手: 非常感谢,思维定式了,楼下首长和 班班的解答可以解决问题,首长的经测试可用

支持(0) 反对(0) 风醉 | 园豆:1197 (小虾三级) | 2014-11-11 17:22
0

表设置不符合数据库设计范式

gltide | 园豆:403 (菜鸟二级) | 2014-11-11 12:59

符合,B表是A表的审减记录

支持(0) 反对(0) 风醉 | 园豆:1197 (小虾三级) | 2014-11-11 13:46
0

不是很懂?查相等的话可以使用in  或者exists

我是糖糖 | 园豆:446 (菜鸟二级) | 2014-11-11 13:12

额,补充了实际业务说明,请看

支持(0) 反对(0) 风醉 | 园豆:1197 (小虾三级) | 2014-11-11 13:53
0

在两个表A2字段相等的情况下,表A中A3不在表B中的数据集合(这里不妨做一个视图,链表查询,条件就是你前面给定的条件。)

大楚打码人 | 园豆:4313 (老鸟四级) | 2014-11-11 13:29

第二个表已经是个视图了,这样说吧,A表 是ID,合同ID,合同下面挂接项目ID,B表是项目的金额审减表,所以是 ID,合同ID,项目ID,审减值,(为什么加合同ID,是因为项目和合同多对多),我就是想找出A表中项目没有审减的记录(在B表中,但是合同ID要对应上)

支持(0) 反对(0) 风醉 | 园豆:1197 (小虾三级) | 2014-11-11 13:51
0

一般我们写的多的是A表一个字段在B表中不存在,我现在要求A表中两个字段组合在B表中不存在

不想深思你其他业务问题,就你这句话而言 可  select (A2+A3) ColA from A where ColA not in (select A2+A3 from B)

AshEs丶 | 园豆:251 (菜鸟二级) | 2014-11-11 14:48

我只是说组合,不能简单的相加吧....打个比方而已,就是两个字段而言没在B中存在同样的数据

支持(0) 反对(0) 风醉 | 园豆:1197 (小虾三级) | 2014-11-11 14:52

@风醉: 只是个思路,A+B 要根据 你实际字段类型来的

支持(0) 反对(0) AshEs丶 | 园豆:251 (菜鸟二级) | 2014-11-11 16:01

@Poison゜: 额,没错,你的思路是对的,谢谢回复,好久没碰数据库了,思维确实有点死,开始没理解你的意思

支持(0) 反对(0) 风醉 | 园豆:1197 (小虾三级) | 2014-11-11 17:27
0

Select concat(合同ID,“+”,项目ID) as IDs from A表 where IDs not in (select concat(合同ID,“+”,项目ID) from B表)

这样可以吗?把两个ID合并成一个字段,再进行两个表之间的比较。

就算合同ID和项目ID是多对多的关系,组合之后应该是唯一的值。

合同ID  项目ID  组合后

21      3         21+3

2       13        2+13

邦邦酱好 | 园豆:202 (菜鸟二级) | 2014-11-11 15:20

 谢谢,你这个回答,我一看就明白了,你这思路应该是正确的,不过分全给上面首长了,谢谢回复

支持(0) 反对(0) 风醉 | 园豆:1197 (小虾三级) | 2014-11-11 17:24

哇,帮帮将

支持(0) 反对(0) +小马哥++ | 园豆:906 (小虾三级) | 2014-11-17 16:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册