- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
给定一个包含如下记录的 MS SQL EXPRESS 2008 R2 表
ArchiveId ScheduleId Data
391063 62 <Data>....</Data>
391064 62 <Data>....</Data>
391065 63 <Data>....</Data>
Data Field 中的 XML 结构如下
<Data>
<Value>1.0</Value>
<Value>2.0</Value>
<Value>3.0</Value>
<Value>4.0</Value>
</Data>
使用以下捕获进行选择的最快方法是什么
Value
节点切碎成列<Value>
<Data>
中的节点节点,它们总是数字理想情况下,我正在寻找格式的数据;
ArchiveId ScheduleId Value1 Value2 etc
391063 62 1.0 2.0
391064 62 1.1 2.1
我试过用
select
ArchiveId,
ScheduleId ,
v.value('(Value/text())[1]', 'float') as value1 ,
v.value('(Value/text())[2]', 'float') as value2 ,
v.value('(Value/text())[3]', 'float') as value3 ,
v.value('(Value/text())[4]', 'float') as value4
from
Archives
cross apply [data].nodes('//Data') x(v)
where
ScheduleId = 2499
和直接的 .values() 和 .queries()
select
ArchiveId,
ScheduleId,
Data.value('(/Data/Value/text())[1]', 'float') as value1,
Data.value('(/Data/Value/text())[2]', 'float') as value2,
Data.value('(/Data/Value/text())[3]', 'float') as value3,
Data.value('(/Data/Value/text())[4]', 'float') as value4
from
Archives
where
ScheduleId = 2499
order by
ArchiveId asc
两者都有效,但在大型数据集上确实很慢,我想知道是否有更快的方法在非常大量的行上执行此类操作。我意识到,无论做什么都需要一段时间,但这样做时我最好的选择是什么。
这里的例子很多,但它们都有更复杂或动态的数据结构,或者有某种基于 xml 内容本身的复杂选择要求。
我拥有的数据始终是相同的结构(一个数据节点和 x 值节点)并且选择标准根本不在 xml 中。
我只是在寻找最简单的方法来拉回大量记录,同时将 xml 扁平化为列。
编辑:本质上,我们将图形数据存储在 xml 中,以便稍后绘制折线图。重要的是,虽然相同 ScheduleId 的元素数量始终相同,但不同的 ScheduleId 将具有不同数量的值元素。
最佳答案
如果您可以将字段添加到 Archives
表,则可以创建持久的计算字段作为 XML 数据的函数。因此,例如,您创建一个字段 value1
并将其设置为等于 Data.value('(/Data/Value/text())[1]', 'float')
然后在列上设置持久标志。这样,当记录被添加或更新时,它将被解析一次,然后它有自己的数据字段,您可以选择输出。
虽然不能直接使用 XML 方法,但由于您必须使用 udf,因此在实践中有点笨拙。但它看起来像这样:
GO
create table TempArchive
(
ArchiveId integer not null,
ScheduleId integer not null,
[Data] xml not null,
CONSTRAINT PK_Archive
PRIMARY KEY CLUSTERED (ArchiveId)
WITH (IGNORE_DUP_KEY = OFF)
)
GO
create function udf_getdatacolumn
(
@data xml,
@index as int
) RETURNS float
with schemabinding
as
begin
return @data.value('(/Data/Value/text())[sql:variable("@index")][1]', 'float')
end
GO
alter table TempArchive add value1 as (dbo.udf_getdatacolumn(data, 1)) persisted
alter table TempArchive add value2 as (dbo.udf_getdatacolumn(data, 2)) persisted
alter table TempArchive add value3 as (dbo.udf_getdatacolumn(data, 3)) persisted
alter table TempArchive add value4 as (dbo.udf_getdatacolumn(data, 4)) persisted
GO
insert into TempArchive values (1, 2, '<Data>
<Value>1.0</Value>
<Value>2.0</Value>
<Value>3.0</Value>
<Value>4.0</Value>
</Data>')
GO
select ArchiveId, ScheduleId, Value1, Value2, Value3, Value4
from TempArchive
GO
返回:
ArchiveId ScheduleId Value1 Value2 Value3 Value4
----------- ----------- ---------- ---------- ---------- ----------
1 2 1 2 3 4
(1 row(s) affected)
请记住,对于大量数据,首次添加这些计算列时会花费很长时间。我建议在投入生产之前对其进行测试。它还会增加表格的大小。
关于sql-server - 在具有切碎/扁平 xml 字段的大表上更快地选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30916859/
是否有某种方法可以使用 JPA 或 Hibernate Crtiteria API 来表示这种 SQL?或者我应该将其作为 native 执行吗? SELECT A.X FROM (SELECT X,
在查询中, select id,name,feature,marks from (....) 我想删除其 id 在另一个 select 语句中存在的那些。 从 (...) 中选择 id 我是 sql
我想响应用户在 select 元素中选择一个项目。然而这个 jQuery: $('#platypusDropDown').select(function () { alert('You sel
这个问题在这里已经有了答案: SQL select only rows with max value on a column [duplicate] (27 个回答) 关闭8年前。 我正在学习 SQL
This question already has answers here: “Notice: Undefined variable”, “Notice: Undefined index”, and
我在 php 脚本中调用 SQL。有时“DE”中没有值,如果是这种情况我想从“EN”中获取值 应该是这样的,但不是这样的 IF (EXISTS (SELECT epf_application_deta
这可能是一个奇怪的问题,但不知道如何研究它。执行以下查询时: SELECT Foo.col1, Foo.col2, Foo.col3 FROM Foo INNER JOIN Bar ON
如何在使用 Camera.DestinationType.FILE_URI. 时在 phonegap camera API 中同时选择或拾取多个图像我能够一次只选择一张图像。我可以使用 this 在
这是一个纯粹的学术问题。这两个陈述实际上是否相同? IF EXISTS (SELECT TOP 1 1 FROM Table1) SELECT 1 ELSE SELECT 0 相对 IF EXIS
我使用 JSoup 来解析 HTML 响应。我有多个 Div 标签。我必须根据 ID 选择 Div 标签。 我的伪代码是这样的 Document divTag = Jsoup.connect(link
我正在处理一个具有多个选择框的表单。当用户从 selectbox1 中选择一个选项时,我需要 selectbox2 active 的另一个值。同样,当他选择 selectbox2 的另一个值时,我需要
Acme Inc. Christa Woods Charlotte Freeman Jeffrey Walton Ella Hubbard Se
我有一个login.html其中form定义如下: First Initial Plus Last Name : 我的do_authorize如下: "; pri
$.get( 'http://www.ufilme.ro/api/load/maron_online/470', function(data
我有一个下拉列表“磅”、“克”、“千克”和“盎司”。我想要这样一种情况,当我选择 gram 来执行一个函数时,当我在输入字段中输入一个值时,当我选择 pounds 时,我想要另一个函数来执行时我在输入
我有一个 GLSL 着色器,它从输入纹理的 channel 之一(例如 R)读取,然后写入输出纹理中的同一 channel 。该 channel 必须由用户选择。 我现在能想到的就是使用一个 int
我想根据下拉列表中的选定值生成输入文本框。 Options 2 3 4 5 就在这个选择框之后,一些输入字段应该按照选定的数字出现。 最佳答案 我建议您使用响应式(Reac
我是 SQL 新手,我想问一下如何根据首选项和分组选择条目。 +----------+----------+------+ | ENTRY_ID | ROUTE_ID | TYPE | +------
我有以下表结构: CREATE TABLE [dbo].[UTS_USERCLIENT_MAPPING_USER_LIST] ( [MAPPING_ID] [int] IDENTITY(1,1
我在移除不必要的床单时遇到了问题。我查看了不同的论坛并将不同的解决方案混合在一起。 此宏删除工作表(第一张工作表除外)。 Sub wrong() Dim sht As Object Applicati
我是一名优秀的程序员,十分优秀!