小编cub*_*729的帖子

当表引用自身时,如何编写查找所有循环引用的查询?

我有以下架构(名称已更改),我无法更改:

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 …

foreign-key sql-server sql-server-2008-r2

28
推荐指数
1
解决办法
2万
查看次数

如何与特权孩子建立一对多关系?

我想要一种一对多的关系,其中对于每个父母,一个或零个孩子被标记为“最喜欢的”。然而,并不是每个父母都会有孩子。(将家长视为本网站上的问题,将孩子视为答案,将最喜欢的视为已接受的答案。)例如,

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

24
推荐指数
2
解决办法
1万
查看次数

历史/时态表的最佳实践?

假设我有一个对象,其中包含我想要跟踪历史的某些字段和我不想跟踪历史的某些字段。从规范化的角度来看,以下模式是否正常:

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)

normalization database-design

12
推荐指数
2
解决办法
1万
查看次数

可以优化涉及 XQuery 函数的 SELECT 查询,该查询从具有任意数量子元素的元素中选择

假设我有以下 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)

xml sql-server sql-server-2012 xquery

2
推荐指数
1
解决办法
1321
查看次数

如何选择具有最大和最小计数的行?

我在 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的= 120行,其中MyGroup的= 2,和10行,其中MyGroup的= 3,然后

    | MyGroup | Count
Max | 1       | 30
Min | 3       | 10
Run Code Online (Sandbox Code Playgroud)

什么样的查询会输出这些信息?

sql-server aggregate count sql-server-2012

1
推荐指数
2
解决办法
1万
查看次数