表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中没有记录的结果集
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表中的记录了。
首长你的回答给了我思路,虽然我执行下,SQL直接死掉了,原因是 A表和B表没有关联关系,合同和项目也是多对多关系,所以这样查询出来的,就是合同号对上了,然后所有的关联项目和结算记录做排列组合显示,
其实我要的很简单,一般我们是A表一个字段在B表中不存在,我现在要求A表中两个字段组合在B表中不存在
@风醉: 不知道你用的是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表了
@车上有首长: TKS,经测试可用,个人思维确实转不过弯,难道人老了
@车上有首长: 另贴上我实际测试的代码和结果
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
A2和A3哪个就父ID A1和B1也是1对多人关系?
A1和B1 就是个ID,没啥关系
的 表确实设计得有点复杂了,不过数据量不大,不考虑性能的话,还是可以用not in 子查询实现。
——
@风醉: select A1 ,A2,A3 from A表
where A3 not in (select A3 from b表)
试试看查出来是你要的数据不?
——
@温柔✿殺手: 少了个前提, 你这是查出A表中A3不在B表的情况,没包含我想要的 A2要对应下,即同一条记录, A表中的A2、A3 和B表中的A2、A3 一样才排除
@风醉: 你怎么不开窍呢?你是要统计项目的金额撒? 同一个项目会有不同的合同吗?如果是,再套一个查询,将刚才查的结果生成一张临时表 where A2 not in(select A2 from b表)
@温柔✿殺手: 呵呵,同一个项目会有不同的合同,但是你这思路有点小问题,首先你第一个排除已经筛选了可能正确的数据,即 比方说 A中 有 ID:1 A2:合同1 A3 项目1 B中 有 ID:1 A2:合同2 A3 项目1
,你第一个SQL,已经筛选掉了 A中的这个数据,实际这条数据是我要的,除非 B中有 ID:X A2:合同1 A3 项目1,不知道是否说清楚了
@风醉: 这表谁设计的啊,太难受了,你这样吧,将两表用left join联查。
select a.*,b.* from A表,B表 where a.a1<>b.a1 or a.a21<>b.a2试试
@温柔✿殺手: 实际业务要求, 合同挂接项目表,合同结算表,项目结算表,涉及到财务是这样的,设计也是和市面上金蝶这种一样的,谢谢回答,但是你这样级联确实没能达到这种效果,我更改了问题的描述,麻烦看下,这样写应该很容易懂了
@风醉: 你的业务我明白了,介意把这两张表导出sql 带几条数据的,我来查查。
136542892@qq.com 发这里来
@温柔✿殺手: 非常感谢,思维定式了,楼下首长和 班班的解答可以解决问题,首长的经测试可用
表设置不符合数据库设计范式
符合,B表是A表的审减记录
不是很懂?查相等的话可以使用in 或者exists
额,补充了实际业务说明,请看
在两个表A2字段相等的情况下,表A中A3不在表B中的数据集合(这里不妨做一个视图,链表查询,条件就是你前面给定的条件。)
第二个表已经是个视图了,这样说吧,A表 是ID,合同ID,合同下面挂接项目ID,B表是项目的金额审减表,所以是 ID,合同ID,项目ID,审减值,(为什么加合同ID,是因为项目和合同多对多),我就是想找出A表中项目没有审减的记录(在B表中,但是合同ID要对应上)
一般我们写的多的是A表一个字段在B表中不存在,我现在要求A表中两个字段组合在B表中不存在
不想深思你其他业务问题,就你这句话而言 可 select (A2+A3) ColA from A where ColA not in (select A2+A3 from B)
我只是说组合,不能简单的相加吧....打个比方而已,就是两个字段而言没在B中存在同样的数据
@风醉: 只是个思路,A+B 要根据 你实际字段类型来的
@Poison゜: 额,没错,你的思路是对的,谢谢回复,好久没碰数据库了,思维确实有点死,开始没理解你的意思
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
谢谢,你这个回答,我一看就明白了,你这思路应该是正确的,不过分全给上面首长了,谢谢回复
哇,帮帮将