MS-Access SQL更新值从同一个表中的“值”到“*值”

时间:2017-08-17 16:00:18

标签: sql vba ms-access

我是访问sql的新手,我在使用tryint格式化从一个表到另一个表的插入数据时遇到了问题。

我有一个看起来像这样的表,其中带有“2017”的值对应于它们周围的代码,如

code
values
* code

因为这是一个非常古老的系统的输出。

+--------------+------------+----------+------+
|     Code     |    Date    |   Time   |  Qt  |
+--------------+------------+----------+------+
| D4D5F44G8    |            |          |      |
| 2017         | 15.08.2017 | 22:30:44 |  792 |
| 2017         | 15.08.2017 | 11:17:03 |   48 |
| 2017         | 15.08.2017 | 04:50:52 |  288 |
| * D4D5F44G8  |            |          |      |
| F45D7W8E9F   |            |          |      |
| 2017         | 15.08.2017 | 04:50:54 |  792 |
| * F45D7W8E9F |            |          |      |
+--------------+------------+----------+------+

我正在尝试插入另一个表值,这些值将代码作为代码的唯一值:

    +--------------+------------+----------+------+
    |     Code     |    Date    |   Time   |  Qt  |
    +--------------+------------+----------+------+
    | D4D5F44G8    | 15.08.2017 | 22:30:44 |  792 |
    | D4D5F44G8    | 15.08.2017 | 11:17:03 |   48 |
    | D4D5F44G8    | 15.08.2017 | 04:50:52 |  288 |
    | F45D7W8E9F   | 15.08.2017 | 04:50:54 |  792 |
    +--------------+------------+----------+------+

但我找不到像交叉应用或在普通sql中几乎相同的值之间获取行,更不用说Access sql了。

这可以通过使用Access SQL实现,还是应该通过一系列功能尝试使用VBA Access?甚至在SQL Server中执行此操作的帮助也会有所帮助,但最好在Access中执行此操作。

任何类型的建议都可以提供帮助,我已经坚持了很长一段时间。

再一次,英语不是我的第一语言,所以感谢您对语法的耐心。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

我发现你已经解决了这个问题,你的方法是最好的解决方案。

但是,您最初要求可能的SQL Server解决方案。通过将数据更改为XML并使用SQL XML功能,您可以在没有游标的情况下执行此操作。像这样:

DECLARE @xmlData as XML

SELECT @xmlData = cast(replace(replace(
(SELECT
(SELECT ('' + fx.[XMLString])
FROM (SELECT
   case when [Date] is null
           then
              case when substring([Code],1,1) = '*'
                      then
                         '</CodeTag>'
                      else
                         '<CodeTag><Code>' + [Code] + '</Code>'
              end
           else
              '<SubCode><Year>' + [Code] + '</Year><Date>' + [Date] + '</Date>
<Time>' + [Time] + '</Time><Qt>' + [Qt] + '</Qt></SubCode>'
   end as [XMLString]
FROM
   #tblYourTableHere) as fx
FOR XML PATH('')) as [txtString])
, '&gt;', '>'), '&lt;', '<') as xml)

您还可以在导入数据时将导入的数据格式化为XML,从而避免使用上述代码。但是如果你已经把它放在一个表中,你可以运行上面的代码。

然后,您可以通过此查询运行该XML代码以获取节点:

SELECT 
   cast(ct.xcode.query('data(Code)') as VarChar(max)) AS [Code]
   ,cast(st.xcode.query('data(Year)') as VarChar(max)) AS [Year]
   ,cast(st.xcode.query('data(Date)') as VarChar(max)) AS [Date]
   ,cast(st.xcode.query('data(Time)') as VarChar(max)) AS [Time]
   ,cast(st.xcode.query('data(Qt)') as VarChar(max)) AS [Qt]
FROM @xmlData.nodes('/CodeTag') ct(xcode)
   CROSS APPLY
   ct.xcode.nodes('./SubCode') AS st(xcode);

不太困难,它使用本机SQL结构。

答案 1 :(得分:0)

最后我通过在ms-access中使用vba来解决它,它比我想象的要容易得多,我忘记了访问后面有一整套语言我可以访问。 bad dum tss

这就是我使用的:

Function Format_LS()
On Error Resume Next
Dim rs As DAO.Recordset
Dim db As Database
Dim strSQL As String
Dim This_Code As String
Dim SQL As String
Set db = CurrentDb
strSQL = "select * from US_Old where Code not alike '%*%'"
Set rs = db.OpenRecordset(strSQL)
This_Code = ""
Do While Not rs.EOF
  If rs("Code").Value <> Trim(Year(Date)) Then
    This_Code = rs("Code").Value
  Else
 SQL = "INSERT INTO US (Code, Date, Time, Qt) VALUES ('" + This_Code + "','" + rs("Date").Value + "','" + rs("Time").Value + "','" + rs("Qt").Value + "')"
 DoCmd.RunSQL SQL
 End If

 rs.MoveNext
End Function

它需要清洁,但它完成了工作。感谢所有试图帮助的人,并向我指出了有用的东西。