查看: 1664|回复: 26
|
VB.Net:如何编 import dbf 进入SQL的编码 和 执行SQL SP (之前问题解决)
[复制链接]
|
|
发表于 7-9-2006 03:57 PM
|
显示全部楼层
不太明白这段:
如果crmp_flg_A = true
那么我就要找那一行的sdA,是哪里一行的sdA or sdB 去吻合,然后拿它的terA/B_cd
就是我在original table里面用青色字的要配一对 |
|
|
|
|
|
|
|
楼主 |
发表于 7-9-2006 04:20 PM
|
显示全部楼层
回复 #2 goatstudio 的帖子
怎么解释好呢。。。
比如说第一段
A1 B1
A1 B1
在第一行的crmp_flg_A=TRUE,
在第二行的crmp_flg_A=TRUE
因为在第二行的terA-cd 是"0000000"
所以我要去找和这一行配对的资料来replace这个 "0000000"
如果"0000000"那一行的crmp_flg_A=TRUE, 我就要看这一行的sdA (A1),然后去找
上一行或下一行的sdA or sdB 也是等于(A1)的,如果 找到了,而且crmp_flg_A=true,就拿terA-cd, 如果crmp_flg_B=TRUE,就拿terB-cd的资料
这个有一点复杂,如果谁不明白,请发文,我尽量解释。。。 |
|
|
|
|
|
|
|
楼主 |
发表于 7-9-2006 04:38 PM
|
显示全部楼层
我附上图片,像2条绳子
第一条,左端的名字A1,右端的名字B1
第二条,左端的名字A1,右端的名字B2
在左端,我要用一个东西,名字是ter1把他们夹起来
由于在运算的时候,我的table里的资料不能放两个ter1,因为两个夹起来只是用一个ter1, 所以我只能以"0000000" 来代替,那我算原料的时候就不会double...
我现在要把这个系统的data转换成text然后upload去另外一个system...
那个system不能接受"000000"一定要有ter1这个名字... |
|
|
|
|
|
|
|
发表于 7-9-2006 05:28 PM
|
显示全部楼层
很古怪的 data structure...
基本上有点头绪, 但有没有可能出现以下的 scenario?
sdA sdB crmp_flg_A TerA-cd crmp_flg_B TerB_cd
--- --- ---------- ------- ---------- -------
A1 B1 TRUE ter1 FALSE ter2
A1 B1 TRUE 0000000 FALSE ter3
D1 D1 FALSE ter2 TRUE ter4
D1 D2 FALSE 0000000 FALSE ter1
F1 G1 TRUE ter9 FALSE ter7
H1 H2 FALSE ter6 FALSE ter6
K1 F1 FALSE 0000000 TRUE ter8 |
|
|
|
|
|
|
|
楼主 |
发表于 7-9-2006 05:56 PM
|
显示全部楼层
回复 #5 goatstudio 的帖子
没有,不会出现你所说的senario。
只要那一边有"0000000" 那个crmp_flg_x就会是TRUE,
而且也不会match不到
因为在那个system里已经avoid user 出现这样的data entry了 |
|
|
|
|
|
|
|
发表于 7-9-2006 06:21 PM
|
显示全部楼层
既然是这样... 通常遇到这种古怪的问题... 我会选择 quick and dirty 的方法.
1. create 一个一模一样的 tmp table, 这里称为 mytable.
2. create 一个 stored procedure
3. 在 stored procedure 里执行以下的步骤:
- 执行 INSERT INTO mytable SELECT * FROM tablename 一次过把资料全部输入.
- 执行以下的 sql:
UPDATE mytable SET mytable.TerA_cd = (SELECT TOP 1 target.TerA_cd FROM mytable target WHERE target.sdA = mytable.sdA AND target.crmp_flg_A = 'TRUE')
WHERE mytable.TerA_cd = '0000000'
UPDATE mytable SET mytable.TerA_cd = (SELECT TOP 1 target.TerB_cd FROM mytable target WHERE target.sdB = mytable.sdA AND target.crmp_flg_B = 'TRUE')
WHERE mytable.TerA_cd = '0000000'
UPDATE mytable SET mytable.TerB_cd = (SELECT TOP 1 target.TerA_cd FROM mytable target WHERE target.sdA = mytable.sdB AND target.crmp_flg_A = 'TRUE')
WHERE mytable.TerB_cd = '0000000'
UPDATE mytable SET mytable.TerB_cd = (SELECT TOP 1 target.TerB_cd FROM mytable target WHERE target.sdB = mytable.sdB AND target.crmp_flg_B = 'TRUE')
WHERE mytable.TerB_cd = '0000000'
- 然后输出结果
- 然后清空 mytable. |
|
|
|
|
|
|
|
楼主 |
发表于 7-9-2006 06:33 PM
|
显示全部楼层
我的问题很古怪吗?
哈哈。。。
(其实我也是这样觉得。。。)
之前本来要当在执行convert text的时候一起做,但是这样做我的coding 更复杂。。。
所以弄得我头壳要裂了。。。
嗯,这样的SQL我还是第一次玩。。。
谢谢,我好好研究一下。。。。。 |
|
|
|
|
|
|
|
楼主 |
发表于 8-9-2006 08:06 AM
|
显示全部楼层
还没有测试。。。
不过。。。还有人有新的idea吗? |
|
|
|
|
|
|
|
发表于 9-9-2006 01:09 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 11-9-2006 11:08 AM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 20-9-2006 04:50 PM
|
显示全部楼层
我尝试了goatstudio的方法,可以行得通。。。。
但是,很奇怪的,当我执行
- UPDATE mytable SET mytable.TerA_cd = (SELECT TOP 1 target.TerB_cd FROM mytable target WHERE target.sdB = mytable.sdA AND target.crmp_flg_B = 'TRUE')
- WHERE mytable.TerA_cd = '0000000'
复制代码
这个的时候,以下的case,那个'0000000'就会变成'NULL', 跑其余3的update就没有变化。。。
A1 B1 TRUE ter1 FALSE ter2
A1 B2 TRUE 0000000 FALSE ter3
我研究很久,都想不到为什么。。。
我观察了我的data, 他的排列变成是
A1 B2 TRUE 0000000 FALSE ter2
A1 B1 TRUE ter1 FALSE ter3
会不会是因为这样的排列而影响呢?
我觉得好像不逻辑咯。。。因为他应该是match第一个update command的啊。。。 |
|
|
|
|
|
|
|
发表于 20-9-2006 09:14 PM
|
显示全部楼层
回复 #12 johe07 的帖子
第一个update command将update D1, D2这行,但也同时update A1,B2这行。
不过因为A1,B2在使用第一个command的时候找不到相应的data所以是NULL
第二个command是用来update A1,B2这行,但是因为用了第一个command的关系,‘000000’变成NULL。结果没有变化
第三第四也是一样。所以行不通
我有个idea,就是用case来做,不知道可不可行,等有空试了在告诉你
[ 本帖最后由 神仙祖宗 于 20-9-2006 09:22 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 21-9-2006 10:05 AM
|
显示全部楼层
试试
select x.sda, x.sdb,
case x.tera_cd when '0000000' then
(select case y.crmp_flg_A when 'TRUE' then y.tera_cd else y.terb_cd end
from table1 y where y.sda = x.sda and y.cda <> '0000000' and y.cdb <> '0000000')
else x.tera_cd end as tera_cd,
case x.terb_cd when '0000000' then
(select case z.crmp_flg_A when 'TRUE' then z.tera_cd else z.terb_cd end
from table1 z where z.sda = x.sdb and z.tera_cd <> '0000000' and z.terb_cd <> '0000000')
else x.terb_cd end as terb_cd
from table1 x |
|
|
|
|
|
|
|
楼主 |
发表于 21-9-2006 11:50 AM
|
显示全部楼层
回复 #14 神仙祖宗 的帖子
我run的时候,[select x.sda, x.sdb,]出现
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
什么意思? |
|
|
|
|
|
|
|
发表于 21-9-2006 11:50 AM
|
显示全部楼层
回复 #15 johe07 的帖子
我也没用过,而且也不会vb.net(过两个月会开始学,到时得请教你叻)
不过上面那个select可以不需要store procedure |
|
|
|
|
|
|
|
楼主 |
发表于 21-9-2006 12:00 PM
|
显示全部楼层
我知道怎样跑了。。。
可以告诉我那个error是什么意思吗?
第一次玩store procedure...所以很白痴 |
|
|
|
|
|
|
|
发表于 21-9-2006 12:09 PM
|
显示全部楼层
回复 #16 johe07 的帖子
有没有类似这样的record?
sdA sdB crmp_flg_A TerA-cd crmp_flg_B TerB_cd
--- --- ---------- ------- ---------- -------
A1 B1 TRUE ter1 FALSE ter2
A1 B1 TRUE terxX FALSE terY
A1 B2 TRUE 0000000 FALSE ter3
D1 D1 FALSE ter2 TRUE ter4
D1 D2 TRUE 0000000 FALSE ter1
F1 G1 TRUE ter9 FALSE ter7
H1 H2 FALSE ter6 FALSE ter6
K1 F1 FALSE ter5 TRUE 0000000
没有的话加个 TOP 1 下去
select x.sda, x.sdb,
case x.tera_cd when '0000000' then
(select top 1 case y.crmp_flg_A when 'TRUE' then y.tera_cd else y.terb_cd end
from table1 y where y.sda = x.sda and y.cda <> '0000000' and y.cdb <> '0000000')
else x.tera_cd end as tera_cd,
case x.terb_cd when '0000000' then
(select top 1 case z.crmp_flg_A when 'TRUE' then z.tera_cd else z.terb_cd end
from table1 z where z.sda = x.sdb and z.tera_cd <> '0000000' and z.terb_cd <> '0000000')
else x.terb_cd end as terb_cd
from table1 x |
|
|
|
|
|
|
|
楼主 |
发表于 21-9-2006 12:16 PM
|
显示全部楼层
回复 #18 神仙祖宗 的帖子
嗯,加了 top 1 可以过了. 我现在在检查者出来的结果对不对。
[ 本帖最后由 johe07 于 21-9-2006 05:11 PM 编辑 ] |
|
|
|
|
|
|
|
楼主 |
发表于 21-9-2006 12:32 PM
|
显示全部楼层
如果是以下这样的case, 我应该怎么改?
sdA sdB crmp_flg_A TerA-cd crmp_flg_B TerB_cd
--- --- ---------- ------- ---------- -------
F1 G1 TRUE 0000000 TRUE ter7
F1 H2 TRUE ter6 FALSE ter6
K1 K1 FALSE ter5 FALSE ter8
G1 P1 TRUE 0000000 FALSE ter1
如果运用神仙祖宗的例子,出来的结果(我highlight的)是NULL...
我尝试给了很多次,还是不可以。。。
因为后面的条件[where y.sda = x.sda and y.cda <> '0000000' and y.cdb <> '0000000'] 促使了第一行不成立。。。
如果我拿走这个condition,也不可以,结果没有变,还是拿到原本的'0000000'
我尝试先去做了update,结果错得离谱。。。
[ 本帖最后由 johe07 于 21-9-2006 05:32 PM 编辑 ] |
|
|
|
|
|
|
| |
本周最热论坛帖子
|