我有以下架构(名称已更改),我无法更改:
CREATE TABLE MyTable (
Id INT NOT NULL PRIMARY KEY,
ParentId INT NOT NULL
);
ALTER TABLE MyTable ADD FOREIGN KEY (ParentId) REFERENCES MyTable(Id);
Run Code Online (Sandbox Code Playgroud)
也就是说,每条记录都是另一条记录的子项。如果记录的ParentId
等于其Id
,则该记录被视为根节点。
我想运行将找到所有循环引用的查询。例如,随着数据
INSERT INTO MyTable (Id, ParentId) VALUES
(0, 0),
(1, 0),
(2, 4),
(3, 2),
(4, 3);
Run Code Online (Sandbox Code Playgroud)
查询应该返回
Id | Cycle
2 | 2 < 4 < 3 < 2
3 | 3 < 2 < 4 < 3
4 | 4 < 3 < 2 < 4
Run Code Online (Sandbox Code Playgroud)
我为 SQL …
我想要一种一对多的关系,其中对于每个父母,一个或零个孩子被标记为“最喜欢的”。然而,并不是每个父母都会有孩子。(将家长视为本网站上的问题,将孩子视为答案,将最喜欢的视为已接受的答案。)例如,
TableA
Id INT PRIMARY KEY
TableB
Id INT PRIMARY KEY
Parent INT NOT NULL FOREIGN KEY REFERENCES TableA.Id
Run Code Online (Sandbox Code Playgroud)
在我看来,我可以将以下列添加到 TableA:
FavoriteChild INT NULL FOREIGN KEY REFERENCES TableB.Id
Run Code Online (Sandbox Code Playgroud)
或 TableB 的以下列:
IsFavorite BIT NOT NULL
Run Code Online (Sandbox Code Playgroud)
第一种方法的问题在于它引入了一个可为空的外键,据我所知,它不是规范化形式。第二种方法的问题是需要做更多的工作来确保最多只有一个孩子是最喜欢的。
我应该使用什么样的标准来确定使用哪种方法?或者,还有其他我没有考虑的方法吗?
我正在使用 SQL Server 2012。
normalization foreign-key database-design sql-server relational-theory
假设我有一个对象,其中包含我想要跟踪历史的某些字段和我不想跟踪历史的某些字段。从规范化的角度来看,以下模式是否正常:
CREATE TABLE MyObject AS (
MyObjectId INT IDENTITY NOT NULL PRIMARY KEY,
MyObjectField1 VARCHAR(100) NOT NULL,
MyObjectField2 VARCHAR(100) NOT NULL,
MyObjectField3 VARCHAR(100) NOT NULL,
MyObjectTrackedField1 VARCHAR(100) NOT NULL,
MyObjectTrackedField2 VARCHAR(100) NOT NULL,
MyObjectTrackedField3 VARCHAR(100) NOT NULL,
)
CREATE TABLE MyObjectHistory AS (
MyObjectHistoryId INT IDENTITY NOT NULL PRIMARY KEY,
MyObjectId INT NOT NULL FOREIGN KEY REFERENCES MyObject(MyObjectId),
MyObjectTrackedField1 VARCHAR(100) NOT NULL,
MyObjectTrackedField2 VARCHAR(100) NOT NULL,
MyObjectTrackedField3 VARCHAR(100) NOT NULL,
)
Run Code Online (Sandbox Code Playgroud)
其中 MyObjectHistory 包含除最新版本之外的所有跟踪字段。或者,是否所有跟踪字段都在一个表中,并且所有修订包括最新版本都在该表中,如下所示:
CREATE TABLE MyObject AS (
MyObjectId …
Run Code Online (Sandbox Code Playgroud) 假设我有以下 XML 数据,其中
<root>
可以有任意数量的<child>
孩子<child>
可以有任意数量的<grandchild>
孩子<grandchild>
可以有任意数量的<greatgrandchild>
孩子<child>
并且<grandchild>
可以有任意数量的<parameter>
孩子<parameter>
都有<name>
一个<value>
孩子例如,
<root name="root">
<child name="a">
<grandchild name="a1">
<parameter>
<name>param1</name>
<value>ABC123</value>
</parameter>
<parameter>
<name>param2</name>
<value>CBC</value>
</parameter>
<greatgrandchild name="a1a">
<parameter>
<name>paramA</name>
<value>ABC</value>
</parameter>
<parameter>
<name>paramB</name>
<value>DBC</value>
</parameter>
</greatgrandchild>
</grandchild>
</child>
</root>
Run Code Online (Sandbox Code Playgroud)
我需要做的是选择包含“_BC”的值的参数,其中 _ 是一个不是 A 的字符。
我有以下查询
SELECT
TestId,
[root],
child,
grandchild,
NULL AS greatgrandchild,
parameter
FROM (
SELECT
TestId,
[root].a.value('@name', 'varchar(max)') AS …
Run Code Online (Sandbox Code Playgroud) 我在 SQL Server 2012 中有下表:
CREATE TABLE [MyTable] (
[Id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(),
[MyGroup] INT NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我想输出表格的表格
| MyGroup | Count
Max | |
Min | |
Run Code Online (Sandbox Code Playgroud)
例如,如果我30
在MyTable的行,其中MyGroup的= 1
,20
行,其中MyGroup的= 2
,和10
行,其中MyGroup的= 3
,然后
| MyGroup | Count
Max | 1 | 30
Min | 3 | 10
Run Code Online (Sandbox Code Playgroud)
什么样的查询会输出这些信息?