MS-Access SQL 将同一表中的值从“Value”更新为“*Value”

Posted

技术标签:

【中文标题】MS-Access SQL 将同一表中的值从“Value”更新为“*Value”【英文标题】:MS-Access SQL update values from "Value" to "*Value" in the same table 【发布时间】:2017-08-17 16:00:18 【问题描述】:

我是 access sql 的新手,我在尝试格式化数据以从一个表插入另一个表时遇到问题。

我有一个看起来像这样的表,其中带有“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 中几乎相同的值之间的行之类的东西,更不用说访问 sql。

这是否可以通过使用 Access SQL 来实现,或者我应该尝试通过一系列函数使用 VBA Access 来做到这一点?即使在 SQL Server 中执行此操作的帮助也会有所帮助,但最好在 Access 中执行此操作。

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

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

【问题讨论】:

您的前提有问题。您甚至使用哪一列来定义输入表中的排序?在内部,Access 对相邻代码一无所知。 该表本身没有键值,它是由系统在进程以代码启动时创建的,然后根据计算它们的时间添加 Qt,当进程停止时,它会关闭它"" 和代码,然后开始另一个。我想说的是,除了获取“code”的值并将它们与“*code”匹配,并以“”作为更接近之外,该表没有任何排序方式跨度> 还有时间戳吗? 没有时间戳,是从.txt导入来访问的。 然后更改您的导入过程,以便包含可以将代码与其真实记录相关联的信息。 【参考方案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 结构。

【讨论】:

这很有趣,我以前从未在 SQLServer 中使用过 XML。我会玩一下这个。【参考方案2】:

最后我通过在 ms-access 中使用 vba 解决了这个问题,这比我想象的要容易得多,我忘记了我可以访问的整个访问背后的语言。 坏的哑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

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

【讨论】:

以上是关于MS-Access SQL 将同一表中的值从“Value”更新为“*Value”的主要内容,如果未能解决你的问题,请参考以下文章

根据其中一个表中的值从多个表中获取 SQL 结果

SQL INNER JOIN - 根据另一行的值从另一个表中选择数据

如何将变量的值从一个 div 传递到同一模板中的另一个 div?

SQL 查询 - 复制同一表中的值

Foxpro / SQL复制值从游标到表的id匹配

怎样将sql数据库中同一表中的一列数据更改为另外一列的数据?