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])
, '>', '>'), '<', '<') 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 INNER JOIN - 根据另一行的值从另一个表中选择数据