以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  这种情况的where条件要如何写?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=118592)

--  作者:happyft
--  发布时间:2018/5/6 23:07:00
--  这种情况的where条件要如何写?
在表中遍历行时得到一些编号值,但有的可能已在sql数据库表中,有的不在,想让不在的才插入

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

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

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

谢谢!

--  作者:有点蓝
--  发布时间:2018/5/7 9:18:00
--  
先查询判断是否在数据库,再插入

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

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


--  作者:HappyFt
--  发布时间: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中),然后用我上面类似的语句一次性插入呢?



--  作者:有点蓝
--  发布时间: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
--  发布时间: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)然后连接成一个大字符串再来判断吧?

谢谢!

--  作者:有点蓝
--  发布时间: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