Foxtable(狐表)用户栏目专家坐堂 → 这种情况的where条件要如何写?


  共有2564人关注过本帖树形打印复制链接

主题:这种情况的where条件要如何写?

帅哥哟,离线,有人找我吗?
happyft
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1942 积分:17896 威望:0 精华:0 注册:2014/7/29 19:09:00
这种情况的where条件要如何写?  发帖心情 Post By:2018/5/6 23:07:00 [只看该作者]

在表中遍历行时得到一些编号值,但有的可能已在sql数据库表中,有的不在,想让不在的才插入

INSERT INTO 事务提醒(单据名称,单据编号)
SE LECT '工序分类', 'Z01' UNION ALL
SE LECT '工序分类', 'D01'
WHERE 单据名称 = '工序分类'  AND 单据编号 NOT IN ( 'Z01', 'Z02' );

比如上面要实现,只插入D01这行

即要插入的都是se lect组合在一起的常量值,这种情况下要如何写where条件?
上面那样会提示,单据名称,单据编号列不存在

谢谢!

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:113484 积分:577909 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/5/7 9:18:00 [只看该作者]

先查询判断是否在数据库,再插入

select 单据编号 from 事务提醒 WHERE 单据名称 = '工序分类'  AND 单据编号  IN ( 'Z01', 'Z02' )

获取已经存在的单据编号,排除后再生成插入的sql


 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1942 积分:17896 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2018/5/7 9:54:00 [只看该作者]

select 单据编号 from 事务提醒 WHERE 单据名称 = '工序分类'  AND 单据编号  IN ( 'Z01', 'Z02' )
这个不能判断,因为事务提醒的单据编号中可能有Z01,而没有Z02,除非每条都去判断,但数据很多时不可能也要每条判断吗?
比如从遍历表中有1万行数据,我用se lect 与Union all 语句拼接了每行的单据编号,想将这些单据编号还没有在事务提醒表中的一次性插入,
如果是sql中的两个数据库表很容易实现
INSERT INTO 事务提醒(单据名称,单据编号) se lect 单据名称,单据编号 from 表B where 单据编号 not in (se lect distinct 单据编码 from 事务提醒 where 单据名称 = '工序分类')
我现在的问题是INSERT INTO 事务提醒(单据名称,单据编号) 后面是用 
SE LECT '工序分类', 'Z01' UNION ALL
SE LECT '工序分类', 'D01' UNION ALL
.....
很多常量数据组合在一起的,是不是必须先将这些数据存入sql的一个临时表中(比如表B中),然后用我上面类似的语句一次性插入呢?



 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:113484 积分:577909 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/5/7 10:37:00 [只看该作者]

只能拼sql:

Dim sb As new  StringBuilder
sb.AppendLine("INSERT INTO 事务提醒(单据名称,单据编号) ")
Dim lst As List(Of String) = DataTables("事务提醒").GetValues("单据编号")
For Each r As Row In Tables("表A").Rows
    If lst.Contains(r("单据编号")) Then Continue For
    sb.AppendLine("SELECT '工序分类', '" & r("单据编号") & "' UNION ALL ")
Next


 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1942 积分:17896 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2018/5/8 14:09:00 [只看该作者]

再请教下如果是用用两列的组合值contains要怎么判断,因为单据编号相同的,工序号可能有1,2,3等,其他单据编号工序号也是1,2,3等
能不用拆开数据判断吗,因为拆开了判断会不正确,
Dim Arys As List(Of String()) = datatables("事务提醒").GetValues("单据编号|工序号")
For Each r As Row In Tables("表A").Rows
    If lst.Contains(r("单据编号") & r("工序号")) Then 
...
    end if
Next
红色的那行会出错,不可能每行都用For Each Ary As String() In Arys 组合Ary(0) & "|" & Ary(1)然后连接成一个大字符串再来判断吧?

谢谢!

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:113484 积分:577909 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/5/8 15:16:00 [只看该作者]

用sql取值比较好一点
select 单据编号+'|'+工序号 as 号 from 事务提醒

通过sqlcommand得到datatable,

Dim lst As List(Of String) = dt.GetValues("")
For Each r As Row In Tables("表A").Rows
    If lst.Contains(r("单据编号") & "|" &  r("工序号")) Then Continue For
    sb.AppendLine("SELECT '工序分类', '" & r("单据编号") & "' UNION ALL ")
Next

 回到顶部