我正在处理这个确切的堆栈交换部分的数据库转储。在我处理它的过程中,我遇到了一个我目前无法解决的问题。
在 XML 文件 Posts.xml 中,内容如下所示
当然有多行,但这就是一个的样子。转储中已经提供了一个 Tags.xml 文件,这使得该图片中的“Tags”属性实际上应该是它的单独表(多对多)变得更加明显。
所以现在我正试图找出一种如何提取标签的方法。这是我尝试做的:
CREATE TABLE #TestingIdea (
Id int PRIMARY KEY IDENTITY (1,1),
PostId int NULL,
Tag nvarchar (MAX) NULL
)
GO
Run Code Online (Sandbox Code Playgroud)
? 我创建的表来测试我的代码。我已经用标签和 PostIds 填充了它
SELECT T1.PostId,
S.SplitTag
FROM (
SELECT T.PostId,
cast('<X>'+ REPLACE(T.Tag,'>','</X><X>') + '</X>' as XML) AS NewTag
FROM #TestingIdea AS T
) AS T1
CROSS APPLY (
SELECT tData.value('.','nvarchar(30)') SplitTag
FROM T1.NewTag.nodes('X') AS T(tData)
) AS S
GO
Run Code Online (Sandbox Code Playgroud)
然而此代码返回此错误
XML parsing: line 1, character 37, illegal qualified name character …Run Code Online (Sandbox Code Playgroud) 随着我获得更多 PostgreSQL 经验,我开始质疑 PLPython 的存在。它被认为是一种“不受信任”的语言https://www.postgresql.org/docs/10/plpython.html
我想知道的是,何时或为什么有人需要使用它?PLPGSQL 已经是一种非常强大的语言,可以让您做很多事情。这里有人需要使用它吗?如果需要,用途是什么?
目前正在学习有关查询优化的一些东西,我一直在尝试不同的查询并偶然发现了这个“问题”。
我正在使用 AdventureWorks2014 数据库,我运行了这个简单的查询:
表结构(取自https://www.sqldatadictionary.com/AdventureWorks2014.pdf):
SELECT C.CustomerID
FROM Sales.Customer AS C
WHERE C.CustomerID > 100
Run Code Online (Sandbox Code Playgroud)
返回 19,720 行
Sales.Customer 中的总行数 = 19,820
在检查以确保 CustomerID 实际上不仅是表的 PK 还具有聚集索引(但它使用非聚集索引)之后,情况确实如此:
EXEC SP_HELPINDEX 'Sales.Customer'
Run Code Online (Sandbox Code Playgroud)
这是执行计划?
https://www.brentozar.com/pastetheplan/?id=B1g1SihGr
我读过当面对大量数据和/或当它返回超过 50% 的数据集时,查询优化器将支持索引扫描。但是该表作为一个整体几乎没有 20,000 行(准确地说是 19,820 行),无论如何它都不是一张大表。
当我运行此查询时:
SELECT C.CustomerID
FROM Sales.Customer AS C
WHERE C.CustomerID > 30000
Run Code Online (Sandbox Code Playgroud)
返回 118 行
https://www.brentozar.com/pastetheplan/?id=Byyux32MS
我得到了一个索引查找,所以我认为这是由于“超过 50% 的情况”但是,我也运行了这个查询:
SELECT C.CustomerID
FROM Sales.Customer AS C
WHERE C.CustomerID > 20000
Run Code Online (Sandbox Code Playgroud)
返回 10,118 行
https://www.brentozar.com/pastetheplan/?id=HJ9oV33zr
它还使用了索引查找,即使它返回了超过 50% 的数据集。
那么这里发生了什么?
编辑:
打开 IO …
我一直在学习Postgres(来自SQL Server),这个错误真的让我很困惑。
\n\n这是带有一些示例数据的代码:
\n\ncreate table T (\nID serial primary key,\nA varchar(1),\nB varchar(1),\nC varchar(1)\n)\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x86\x91 测试表。
\n\ninsert into T (A, B, C)\nvalues('A', 'B', 'C'), ('A', 'B', 'C')\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x86\x91 插入重复项
\n\ndelete from T\nwhere ID in (\n select t.ID\n from ( select ID, row_number() over (partition by A,B,C order by A,B,C) as rn\n from T) as t\n where t.rn < (select max(t.rn) from t)\n )\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x86\x91 删除重复项并保留最后一个条目。
\n\n问题在于(select max(t.rn) from t)我假设这是一个菜鸟错误,与在引用带有别名的列时不知道 postgres 语法有关? …
postgresql ×2
sql-server ×2
duplication ×1
index ×1
optimization ×1
plpgsql ×1
plpython ×1
subquery ×1
xml ×1
xquery ×1