佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1663|回复: 26

VB.Net:如何编 import dbf 进入SQL的编码 和 执行SQL SP (之前问题解决)

[复制链接]
发表于 7-9-2006 03:10 PM | 显示全部楼层 |阅读模式
好久没来求助了。。。我有来了。。。


我遇到一个问题,我不知道应该如何解决
我要把一个table的资料,转换去text base file

以下是original table 的 data

sdA  sdB   crmp_flg_A  TerA-cd   crmp_flg_B  TerB_cd
---  ---   ----------  -------   ----------  -------
A1    B1     TRUE       ter1       FALSE      ter2
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

如果按照以上的资料来转换,我必须换成以下形式的text file:

A1;B1;ter1;ter2;
A1;B1;ter1;ter3;
D1;D1;ter2;ter4;
D1;D2;ter4;ter1;
F1;G1;ter9;ter7;
H1;H2;ter6;ter6;
K1;F1;ter5;ter9;

我用红色字的,就是由原本"0000000"换成了“terx"

如果crmp_flg_A = true
那么我就要找那一行的sdA,是哪里一行的sdA or sdB 去吻合,然后拿它的terA/B_cd
就是我在original table里面用青色字的要配一对

我不知道我要用怎样的方法才可以做到
我是想直接在table里面把"0000000"的东西replace掉,才来做convert

请问会有idea我可以怎样做吗?我想了很久都没有办法

[ 本帖最后由 johe07 于 28-9-2006 08:24 AM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 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了
回复

使用道具 举报

Follow Us
发表于 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我还是第一次玩。。。
谢谢,我好好研究一下。。。。。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 8-9-2006 08:06 AM | 显示全部楼层
还没有测试。。。

不过。。。还有人有新的idea吗?
回复

使用道具 举报

发表于 9-9-2006 01:09 PM | 显示全部楼层
我解開了﹐有需要的話﹐PM 我吧
回复

使用道具 举报

发表于 11-9-2006 11:08 AM | 显示全部楼层
解決方法可以從這裡下載﹐如有什麼錯誤的地方﹐請指教。

www.pc.net.my/temp/test.zip
回复

使用道具 举报

 楼主| 发表于 20-9-2006 04:50 PM | 显示全部楼层
我尝试了goatstudio的方法,可以行得通。。。。
但是,很奇怪的,当我执行

  1. 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')
  2. 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
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 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 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 23-9-2024 07:16 PM , Processed in 0.120273 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表