急用:多表查询的问题!!(100分)

  • 主题发起人 主题发起人 puremoonstone
  • 开始时间 开始时间
P

puremoonstone

Unregistered / Unconfirmed
GUEST, unregistred user!
急用:多表查询的问题
有这样三个表“承付单表”、“承付单商品信息子表”、“结算单表”,
“承付单表”的主要字段是“付款编号”,它记录了用户的承付状况(这是一个小编号,
如FK01-1-1,FK01-1-2表示用户对一批商品付了两次款);
“承付单商品信息子表”的主要字段是“付款编号”(这是一个大编号,如FK01-1)和
“进仓单号”,它记录了用户本次大承付所对应的商品(包括进仓的商品和未进仓的,如果
未进仓,则进仓单号为空),存在这样的情况:用户在FK01-1-1时付款,商品尚未进仓,用户
可能自行输入了商品或根本没有输入商品;在FK01-1-2时付款,商品进仓了,这时
如果“承付单商品信息子表”中保存有未进仓的商品,则会用进仓了的商品自动替换掉未
进仓的商品。
“结算单表”的主要字段是“结算单号”和“付款编号”(这是一个大编号)。
现在,我想从“承付单表”中查出同时满足下列条件的“付款编号”(大编号):
1、该“付款编号”不在“结算单表”中(既尚未被结算)
2、该“付款编号”不在“承付单商品信息子表”中(即该大编号下的小编号不在此表中,
这说明用户预付款时没有输入商品)或者该“付款编号”在“承付单商品信息子表”中,
但对应的商品的进仓单号为空(这说明该付款对应的商品信息是用户在预付款时自行输入的)
注:条件2的意思就是如果该“付款编号”在“承付单商品信息子表”中,而且它对应的商品
有进仓单号,那么它就不满足本条件。
由于涉及大小编号的转换,实现起来很麻烦。请问怎样用SQL实现呢?
谢谢您费心看完问题,我在期待您的帮助!
 
xixi
select * from 承付单表
where (付款编号 not in (select 付款编号 from 结算单号) and
((付款编号 not in (select substring(付款编号,1,6) from 承付单商品信息子表) or
((付款编号 in (select substring(付款编号,1,6) from 承付单商品信息子表)and
(进仓单号 is NULL))
如你的数据库是sql server你可试试,是其它的你做相应的改动

 
select * from 承付单表
where (付款编号 not in (select 付款编号 from 结算单号) and
(NOT(付款编号 in (select substring(付款编号,1,6) from 承付单商品信息子表) and
(NOT(进仓单号 is NULL)))))
也对吧?
我的数据库是Sql Server,但是我不知道怎样将它放到
with adoquery1 do
begin
with sql do
begin
close;
clear;
text(或add)
end;
open;
end;
中去。此外,付款编号FK01-1-2只是个例子,它的长度是变长的,也可能为FK01-10-2,
FK01-100-2等,我可以用如下的语句从小编号中取出大编号,但是放到SQL中该怎么办呢?
还请您多多指教!谢谢!
var str1,smallno,bigno:string;
smallno:='FK01-1-2'; //小编号
str1:=copy(smallno,1,pos(smallno,'-')); //得到“FK01-”
str2:=copy(smallno,pos(smallno,'-')+1,length(smallno)); //得到“1-2”
str2:=copy(str2,1,pos(str2,'-')); //得到“1”
bigno:=trim(str1+str2); //大编号
(当然,可能还有简单的方法,我不知道怎样指定第二个“-”的位置;不过,我没有办法把它
放到SQL中去.)
 
你可以用存储过程,看看例子就知道了。
 
你可以用存储过程,看看例子就知道了。
create store proc test
DECLARE str1 varchar(100)
DECLARE smallno varchar(100)
DECLARE bigno varchar(100)
select smallno='FK01-1-2'; //小编号
......
具体的字符串函数有以下几个,可以实现你的操作
ASCII
REPLICATE
CHAR
REVERSE
CHARINDEX
RIGHT
DIFFERENCE
RTRIM
LEFT
SOUNDEX
LEN
SPACE
LOWER
STR
LTRIM STUFF
NCHAR SUBSTRING
PATINDEX UNICODE
REPLACE UPPER
QUOTENAME

 
to sportsman:能不能详细些,我还没用过存储过程。
to sonie:那个SQL该怎么写?
 
请大家多多帮忙!谢谢!
 
问题的关键是不知道小编号中大编号的大小.你可建2个存储过程,
一个存储过程是为将传入的一个小编号中的大编号取出.
另一个存储过程是主存储过程
1.将<<承付单表>>的纪录倒入临时表.在临时表中加一个字段专门放大编号
这可由流标解决.在读每行纪录时,调第一个存储过程得到大编号
2.有了这张临时表,别的就方便了.
这个方法实现起来来挺烦的.

我建议你改一下表结构
将<<承付单表>>拆成二张表.主附表
主表记录 大编号,intID int IDENTITY(1,1)
附表记录 intID,小编号 ,别的字段
二个表以intID关联
这样的话你的sql就简单的多了




 
目前不大可能修改表的结构,因为表中已经有很多有用数据了。
 
前近网络有点问题,所以来得不多,对如下问题
var str1,smallno,bigno:string; smallno:='FK01-1-2'; //小编号
str1:=copy(smallno,1,pos(smallno,'-')); //得到“FK01-”
str2:=copy(smallno,pos(smallno,'-')+1,length(smallno)); //得到“1-2”
str2:=copy(str2,1,pos(str2,'-')); //得到“1” bigno:=trim(str1+str2); //大编号
(当然,可能还有简单的方法,我不知道怎样指定第二个“-”的位置;不过,我没有办法把它放到SQL中去.)
:答复如下,把相应语句substring(付款编号,1,6) 换成
substring(付款编号,1,len(付款编号)-charindex("-",REVERSE(付款编号)))即可。
如还有问题,直接写信给我,最近我的网络有问题

 
快一个月了,sigh
 
用异构查询
 
to sonie:非常感谢您。我问了两个sql的问题,您都很热心地回答了,前一个问题我已经
结束了,这个问题也将尽快结束。
 
客气什么,相互学习,共同提高嘛。
 
我终于把表修改了,问题解决了。谢谢!
 
多人接受答案了。
 
后退
顶部