我已经尝试使用"FOR XML PATH","FOR XML EXPLICIT"和"FOR XML AUTO",但数据永远不会使用正确的层次结构.
基本上,我有一个父表(Customers)和3个子表.每个表都有一个customerid列.从Customers表到3个子表中的每一个都有一对多的关系.
作为一个模拟示例,我有一个父"客户"表,我有3个其他表 - 产品,爱好和车辆 - 所有与customerid相关的Customers表.
实现以下类型结构的SQL代码是什么 -
<Customers>
<Customer customerid="1" name="Fred">
<Products>
<Product productname="table" />
<Product productname="chair" />
<Product productname="wardrobe" />
</Products>
<Hobbies>
<Hobby hobbyname="Golf" />
<Hobby hobbyname="Swimming" />
</Hobbies>
<Vehicles>
<Vehicle name="Car" color="Red" />
<Vehicle name="Bicycle" color="Blue" />
</Vehicles>
</Customer>
<Customer customerid="2" name="Sue">
<Products>
<Product productname="CD player" />
<Product productname="Picture frame" />
</Products>
<Hobbies>
<Hobby hobbyname="Dancing" />
<Hobby hobbyname="Reading" />
</Hobbies>
<Vehicles>
<Vehicle name="Car" color="Yellow" />
</Vehicles>
</Customer>
</Customers>
Run Code Online (Sandbox Code Playgroud) 现在我已经阅读了其他stackoverflow Game of Life问题,并且还贪婪地使用Google搜索.我知道如何为我的Python生命游戏实现.我想跟踪网格中的活动单元格.问题是我是坚持我应该如何编码.
这就是我的想法,但除此之外,我的智慧结束了:
B C D
. A .
. . .
我考虑使用OrderedSet或其他东西来处理订单并避免重复.但是我仍然遇到了这些问题.我只需要一个方向.
给定一个 XML 类型的字符串,例如
declare @xml xml
SET @xml =
'<PO>
<Amount type="approved">10.00</Amount>
<Year type="">2013</Year>
<GeneralNotes>
<Note>
<NoteText type="instruction">CallVendor</NoteText>
<Date type="">1-1-2013</Date>
</Note>
<Note type="">
<NoteText type="instruction">ShipNow</NoteText>
<Date type="">2-2-2013</Date>
</Note>
</GeneralNotes>
</PO>'
Run Code Online (Sandbox Code Playgroud)
我想获取每个元素及其属性(如果有的话)。我想要的输出(没有重复)是
ElementName ElementAttribute
PO
Amount approved
Note instruction
Run Code Online (Sandbox Code Playgroud)
我试过类似于这一行的代码
SELECT T.doc.query('fn:local-name(.)')
FROM @xml.nodes('PO//*[1]') AS T(doc)
Run Code Online (Sandbox Code Playgroud)
这会导致重复,我不确定如何选择属性值。我只需要第一次出现(即。GeneralNotes/Note[1]
)。我有一个包含许多其他元素名称的大文件,所以我不想单独解析它们。
我想知道,如何将 XML 内容从任意文件加载到局部变量中?
这适用于固定文件:
DECLARE @xml XML
SET @xml =
(
SELECT *
FROM OPENROWSET(BULK 'C:\data.xml', SINGLE_BLOB) AS data
)
Run Code Online (Sandbox Code Playgroud)
但是,我想从任何任意文件加载数据。
这不起作用(因为 BULK 似乎只支持 String 参数)
DECLARE @file NVARCHAR(MAX) = 'C:\data.xml'
DECLARE @xml XML
SET @xml =
(
SELECT *
FROM OPENROWSET(BULK @file, SINGLE_BLOB) AS data
)
Run Code Online (Sandbox Code Playgroud)
我还尝试了以下操作(没有成功,因为执行 EXEC 时局部变量(@xml)似乎超出了范围):
DECLARE @file NVARCHAR(MAX) = 'C:\data.xml'
DECLARE @xml XML
DECLARE @bulk NVARCHAR(MAX) = 'SET @xml = (SELECT * FROM OPENROWSET(BULK ''' + @file + ''', SINGLE_BLOB) AS data)'
EXEC (@bulk)
Run Code Online (Sandbox Code Playgroud)
我猜我需要使用临时表,但是如何使用?
我知道这不可能嵌套insert ... exec
语句,但我仍然很感兴趣 - 有没有办法检查我是否已经处于活动状态insert ... exec
以避免实际错误?
所以我想要这样的东西:
....
if <check if I have outer insert into exec> = 0
insert into <#some temporary table>
exec <stored procedure>
Run Code Online (Sandbox Code Playgroud)
换句话说 -insert ... exec
是可选的,拥有它很好,但如果有人试图用外部调用我的过程,我想跳过它insert ... exec
我有一个数据库,其中包含一个名为Items的表,其中包含以下列:
name字段可用于构建项目的路径,方法是遍历每个ParentId,直到它等于'11111111-1111-1111-1111-111111111111',这是一个根项.
所以如果你有一个像行一样的表
ID Name ParentID
-------------------------------------------------------------------------------------
11111111-1111-1111-1111-111111111112 grandparent 11111111-1111-1111-1111-111111111111
22222222-2222-2222-2222-222222222222 parent 11111111-1111-1111-1111-111111111112
33333333-3333-3333-3333-333333333333 widget 22222222-2222-2222-2222-222222222222
Run Code Online (Sandbox Code Playgroud)
所以如果我在上面的例子中查找了一个id为'33333333-3333-3333-3333-333333333333'的项目,我想要的是路径
/grandparent/parent/widget
Run Code Online (Sandbox Code Playgroud)
回.我试图写一个CTE,因为它看起来就像你通常会完成这样的事情 - 但由于我不做很多SQL,我无法弄清楚我哪里出错了.我已经看了一些例子,这和我似乎能够得到的一样 - 只返回子行.
declare @id uniqueidentifier
set @id = '10071886-A354-4BE6-B55C-E5DBCF633FE6'
;with ItemPath as (
select a.[Id], a.[Name], a.ParentID
from Items a
where Id = @id
union all
select parent.[Id], parent.[Name], parent.ParentID
from Items parent
inner join ItemPath as a
on a.Id = parent.id
where parent.ParentId = a.[Id]
)
select * from …
Run Code Online (Sandbox Code Playgroud) 我无法将end_date
在key_request
时区中调用的表中调用的列更改为timestamp
Postgres数据库.我尝试使用以下代码:
alter table key_request alter column end_date type timestamp with time zone using end_date::timestamp with time zone
Run Code Online (Sandbox Code Playgroud)
我一直收到以下错误:
ERROR: cannot cast type time with time zone to timestamp with time zone
Run Code Online (Sandbox Code Playgroud)
知道如何调整此查询才能工作吗?
我正在尝试不同的JOIN查询,但我没有得到我正在寻找的结果.
我有两张桌子:
Table 1: **StockItemShort**
ItemID | Code | Name
432724 | CK002-16-09 | Green Daisy Pearl Earrings
432759 | CK002-16-149 | Emerald Crystal Centre Daisy Earrings
Table 2: **StockItemCatSearchValueShort**
ItemID | SearchValueID
432724 | 388839
432724 | 389061
432724 | 390269
432724 | 389214
432759 | 388839
432759 | 389051
432759 | 390269
432759 | 389214
Run Code Online (Sandbox Code Playgroud)
我无法得到我正在寻找的结果.
我想获得以下结果:
ItemID | Code | Name | SearchValueID | SearchValueID | SearchValueID | SearchValueID
432724 | CK002-16-09 | Green Daisy Pearl Earrings …
Run Code Online (Sandbox Code Playgroud) 我有一个简单的Django模型
class Server(models.Model):
name = models.CharField(max_length=120)
class ServerPropertie(models.Model):
name = models.CharField(max_length=120)
value = models.CharField(max_length=120)
timestamp = models.DateTimeField()
server = models.ForeignKey(Server)
Run Code Online (Sandbox Code Playgroud)
我想将get_properties方法添加到Server模型,该模型将返回当前服务器的所有最后一个属性.我的意思是它应该返回当前服务器的所有属性名称的名称和值,并且每个uniq属性名称应该具有值,该行具有最大时间戳.
我可以在原始的硬编码原始SQL(我使用postgres)中做到这一点:
SELECT t1.name, t1.value FROM environments_serverpropertie t1
JOIN (SELECT max("timestamp") "timestamp", name
FROM environments_serverpropertie
group by name) t2 on t1.name = t2.name and t1.timestamp = t2.timestamp;
Run Code Online (Sandbox Code Playgroud)
或者在python中,但我相信存在pythonic解决方案.请你帮助我好吗.
更新:使用Update_Columns()不是这个问题的答案,因为字段可能会按触发器的顺序更改(Update_Columns取决于列顺序).
更新2:我已经知道Deleted和Inserted表保存了数据.问题是如何确定已更改的内容而无需对字段名称进行硬编码,因为字段名称可能会更改,或者可能会添加字段.
可以说我有一个有三个字段的表.
该行已存在,现在用户更新字段1和2.
如何在更新触发器中确定更新字段的内容以及前后值的位置?
我想将这些记录到日志表中.如果有两个字段更新,则应在历史记录表中生成两行.
Table
Id intField1 charField2 dateField3
7 3 Fred 1995-03-05
Updated To
7 3 Freddy 1995-05-06
History Table
_____________
Id IdOfRowThatWasUpdated BeforeValue AfterValue (as string)
1 7 Fred Freddy
2 7 1995-03-05 1995-05-06
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用Deleted表来获取旧值,并使用inserted表来获取新值.然而,问题是如何动态地这样做.换句话说,实际的表有50列,我不想将50个字段硬编码到SQL语句中,如果字段发生变化,也不想担心保持SQL同步表格变化.
格雷格
sql ×9
sql-server ×7
sqlxml ×3
xml ×3
postgresql ×2
python ×2
alter ×1
django ×1
insert-into ×1
recursion ×1
t-sql ×1
timestamp ×1