AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-79957

crichavin's questions

Martin Hope
crichavin
Asked: 2024-08-07 09:43:56 +0800 CST

为什么使用大于比较时会返回与谓词值匹配的日期时间值

  • 9

我想查找任何大于谓词中提供的时间的记录,该记录来自一个只有类型的 C# Web 应用程序DateTime。但是,SQL Server 返回的行等于提供的谓词值。为什么会这样?该ShipDateTimeUTC列是一种datetime数据类型。

DECLARE @p__linq__1 datetime2(7) = '2024-08-07 00:14:11.3630000';

SELECT 
    [OrderHeaderId],
    Id,
    [ShipDateTimeUTC]
FROM  
    [dbo].[ShippingContainerHeader]
WHERE 
    [ShipDateTimeUTC] > @p__linq__1;

以下是结果,您可以看到 ShipDateTimeUTC 与谓词值匹配。我不希望它被包括在内。为什么它会被包括在结果中?

sql 结果

sql-server
  • 2 个回答
  • 368 Views
Martin Hope
crichavin
Asked: 2020-10-10 11:40:55 +0800 CST

加入以获得没有 PIVOT 的租户的最具体记录

  • 0

我有一张Settings桌子和一张Tenant桌子。有一个层次结构,一个Account可以有 1 个或多个Companies,一个Company可以有 1 个或多个“设施”。

Account 1
   ---> Company 1
          ---> Facility 1   
          ---> Facility 2
   ---> Company 2
          ---> Facility 3   
          ---> Facility 4

他们可能有一个适用于整个帐户的默认设置....

| FacilityId | CompanyId | AccountId | SettingValue |
|------------|-----------|-----------|--------------|
|     (null) |    (null) |         1 |            5 |

...除了设施 3 的一个覆盖仅适用于设施 3 之外,所有其他设施将使用帐户级别的默认设置值。

| FacilityId | CompanyId | AccountId | SettingValue |
|------------|-----------|-----------|--------------|
|          3 |    (null) |         1 |            6 |
   

我想在它们之间创建一个连接,以便为每个租户获取最具体的设置。最具体被定义为匹配's的Setting记录比匹配更具体的匹配比匹配更具体,最后,如果未找到匹配项,则使用所有 3 个值的设置。TenantFacilityIdCompanyIdAccountIdNULL

我不想使用该PIVOT功能,因为代码使用实体框架和 LINQ,并且没有 LINQ to SQL 用于PIVOT. 基本上需要简单的 SQL,您可以为其创建一个视图......所以没有临时表等。如果可能的话,不要寻找存储的 proc 解决方案。

SQLFiddle

桌子:Settings

| FacilityId | CompanyId | AccountId | SettingValue |
|------------|-----------|-----------|--------------|
|          1 |         1 |         1 |            5 |
|     (null) |         2 |         2 |            7 |
|     (null) |         1 |         1 |            4 |
|     (null) |    (null) |         2 |            6 |
|     (null) |    (null) |         1 |            3 |
|     (null) |    (null) |    (null) |            2 |

桌子:Tenants

| FacilityId | CompanyId | AccountId |
|------------|-----------|-----------|
|          1 |         1 |         1 |
|          2 |         2 |         2 |
|          3 |         3 |         3 |

所以加入这些会有这个期望的输出:

| FacilityId | CompanyId | AccountId | SettingValue |
|------------|-----------|-----------|--------------|
|          1 |         1 |         1 |            5 |
|          2 |         2 |         2 |            7 | --> this account would match to a setting value of 6 or 7, but the 7 value matches more specifically
|          3 |         3 |         3 |            2 | --> there is no match on Facility, Company, or Account so match to all nulls.

在代码中,我正在执行以下操作以获取Setting给定的最具体信息Tenant,但我现在需要为大量Tenant数据执行此操作,因此希望通过 SQL 连接来执行此操作。对于不熟悉 LINQ 的人来说,双管道 ( ||) 等同于OR.

private SettingViewModel GetSettingBy(string strKey)
{
    var allSettings = GetAllSettings();
    var settingQuery = allSettings.Where(x => x.SettingKey == strKey);

    if (_accountCompanyFacilityViewModel.AccountId.HasValue)
    {
        settingQuery = settingQuery.Where(x => (x.AccountId == _accountCompanyFacilityViewModel.AccountId || x.AccountId == null));
    }

    if (_accountCompanyFacilityViewModel.CompanyId.HasValue)
    {
        settingQuery = settingQuery.Where(x => (x.CompanyId == _accountCompanyFacilityViewModel.CompanyId || x.CompanyId == null));
    }

    if (_accountCompanyFacilityViewModel.FacilityId.HasValue)
    {
        settingQuery = settingQuery.Where(x => (x.FacilityId == _accountCompanyFacilityViewModel.FacilityId || x.FacilityId == null));
    }

    var setting = settingQuery
            .OrderByDescending(x => x.FacilityId)
            .ThenByDescending(x => x.CompanyId)
            .ThenByDescending(x => x.AccountId)
            .FirstOrDefault();
            
    return setting;
}

这是答案的SQL Fiddle

sql-server sql-server-2016
  • 1 个回答
  • 30 Views
Martin Hope
crichavin
Asked: 2018-04-14 12:18:51 +0800 CST

帮助 CTE 递归地聚合子级

  • 6

我正在尝试创建一个查询来计算库存中所有物品的“可出售”数量。在这种情况下,一个项目可以有当前可用的库存,但也可以是一个套件,它由可以组装成成品的原材料组成。因此,可供出售的是当前可用的成品 (FG) 数量加上可以制成 FG 的最少组件。

例子:

假设我们正在销售由笔记本电脑和手提包组成的笔记本电脑套件。如果我们已经制作了 2 个套件、6 台笔记本电脑和 3 个手提包,那么我们可以出售的这些套件是 2 + 3 = 5 个。在这种情况下,手提袋是限制因素。即使我们有 6 台笔记本电脑,我们也只能再制作 3 台套件,因为我们的包限制了我们。

我已经做到了这一点,计算工作从最低级别 2 到级别 1,但级别 0 不正确。所以在这种情况下,笔记本电脑套件的计算是正确的(手头有 11 个 + 我们可以再做 4 个 = 15 个可供出售)。但是顶级笔记本电脑和包套件是不正确的。顶层(笔记本电脑和包套件)的直系子代的最低可售率为 15 + 3 现有套件 = 18,而不是 14。

在此处输入图像描述

我在想也许我需要添加第二个递归 CTE 而不是我在最终选择中的左连接?

SQL小提琴

CREATE TABLE Item (
  Id INT,
  ParentId INT,
  DisplaySeq INT,  
  DisplayText VARCHAR(30),
  OnHandQty INT
  );

INSERT INTO Item (Id, ParentId, DisplaySeq, DisplayText, OnHandQty) VALUES
(9, NULL, 0, 'Laptop & Bag Kit', 3),
(8, 9, 5, 'Laptop Kit', 11),
(7, 8, 10, 'Laptop', 5),
(6, 8, 15, 'Power Supply', 4),
(26, 9, 20, 'Bag', 23)
;

;WITH items AS (
  SELECT 
    Id 
    , 0 as ParentId
    , Id as RootId
    , 0 AS Level
    , CAST(DisplaySeq AS VARCHAR(255)) AS Path
    , CAST('---' AS varchar(100)) AS LVL
    , CAST(DisplayText as VARCHAR(255)) as DisplayText
    , OnHandQty
  FROM Item 
  WHERE ParentId IS NULL

  UNION ALL

  SELECT 
    child.Id
    , child.ParentId
    , parent.RootId
    , Level + 1
    , CAST(parent.Path + '.' + CAST(child.DisplaySeq AS VARCHAR(255)) AS VARCHAR(255)) AS Path
    , CAST('---' + parent.LVL AS varchar(100)) AS LVL
    , CAST(parent.LVL + child.DisplayText as VARCHAR(255)) as DisplayText
    , child.OnHandQty
  FROM 
    Item child
      INNER JOIN items parent 
      ON parent.Id = child.ParentId
  )

SELECT 
  t.Path
  , t.RootId
  , t.Id
  , t.ParentId
  , t.Level
  , t.DisplayText
  , t.OnHandQty
  , COALESCE(s.MaxCanMake, t.OnHandQty) as MaxCanMake
  , t.OnHandQty + COALESCE(s.MaxCanMake, 0) as AvailToSell
FROM 
  items t
    left join (
        Select 
          ParentId,
          MIN(OnHandQty) as MaxCanMake
        FROM items
        GROUP BY ParentId
      ) as s
      ON t.Id = s.ParentId

ORDER BY t.Path
sql-server cte
  • 1 个回答
  • 1511 Views
Martin Hope
crichavin
Asked: 2017-08-17 10:01:18 +0800 CST

截断表需要多长时间才能处理 252M 行(170GB 数据)?

  • 2

我知道这里面有很多变量,我不是在寻找确切的 min:sec 数量:) 我已经阅读了许多资源,这些资源表明 aTRUNCATE使用的资源比 a 少得多DELETE,因此性能会更快。但是没有提到数量级。由于 aTRUNCATE是 DDL(数据定义语言)操作而不是 DML(数据操作语言)操作,并且只有系统表是事务的一部分,我假设它不会花费很长时间。

任何有经验的人都可以使用接近这种尺寸的桌子来做这件事,可以提供一些见解?我们谈论最多一分钟,最多一个小时,几天,几周?

sql-server sql-server-2005
  • 1 个回答
  • 6814 Views
Martin Hope
crichavin
Asked: 2017-08-17 07:18:45 +0800 CST

截断大表后数据库备份时间和大小会减少吗

  • 3

我们 SQL Server 数据库中的两个表相当于 500M 行和 350GB 数据。磁盘空间是我们保留备份的问题,执行备份的时间也是如此。我们计划截断这两个表。

我知道要回收磁盘空间,我们需要在截断后缩小数据库,然后重建索引以修复碎片索引。但由于我们不确定重建需要多长时间(我们现在正在 Azure 中启动测试服务器 VM 进行测试),与此同时我们正在寻找增量收益。在刚刚截断之后(在收缩和重建之前),备份时间和生成的备份文件大小(在 7z 压缩之后)是否会因此显着减少?

sql-server backup
  • 1 个回答
  • 880 Views
Martin Hope
crichavin
Asked: 2017-07-27 21:08:01 +0800 CST

关于删除所有行和回收超大表空间的建议

  • 0

我不是 dba...让我们从那个开始 :) 我是应用程序开发人员。但是我们的数据库有一个存档表,它有 2.52 亿行和 170GB,我被派去修复它(实际上,这个类别中有多个表我需要清理)。但我们决定不需要保留任何此类数据。因为这个表是一个存档表,我的意思是这个数据有一个主事务表,但是应用程序有办法通过存档或移动旧记录到这个存档表来保持事务表更小。

作为存档表,它没有每个 SSMS 的依赖项(没有索引或外键)。此数据库设置为完全恢复模式。

我们的维护窗口很短,所以需要一个快速的过程,而且我们的磁盘空间有限,所以我们需要从这个表中回收磁盘空间。

我们可以截断表,那么如何回收空间呢?我们不想进行数据库收缩,因为它会收缩所有表,因此我们需要运行索引重建……至少这是我的理解,这可能是不正确的。

我可以从 SSMS 中保存一个脚本(脚本表作为 Create To...)。然后删除表,然后重新创建它......这有风险吗?它会回收空间吗?

其他想法?

sql-server-2005 maintenance
  • 1 个回答
  • 142 Views
Martin Hope
crichavin
Asked: 2016-02-03 14:21:17 +0800 CST

从事务日志查询中获取表名

  • 1

我无法弄清楚为什么在查询事务日志文件时此连接无法返回表名。

SELECT [Transaction ID], 
    [Current LSN], 
    PartitionId, 
    sp.object_id,   
    so.[name], 
    [Operation],  
    [Context],
    [AllocUnitName],
    [Begin Time],
    [End Time],
    [Transaction SID],
    [Num Elements] ,
    [RowLog Contents 0],
    [RowLog Contents 1],
    [RowLog Contents 2],
    [RowLog Contents 3]
 FROM fn_dump_dblog(NULL,NULL,'DISK',1
    ,'D:\Users\Chad\SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Backup\OTIS_LogBackup_2016-02-02_13-36-21.bak'
    ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
    ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
    ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
    ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
    ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
    ,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
    ,NULL,NULL,NULL,NULL) as logF
    LEFT OUTER JOIN sys.partitions sp ON sp.partition_id = logF.PartitionId 
    LEFT OUTER JOIN sys.objects so on so.object_id = sp.object_id
WHERE
    [Transaction ID] = '0000:00d15747';

这是结果。您可以看到分区 ID 已填充:

在此处输入图像描述

当我执行此查询以获取表名时,它使用在先前结果中找到的分区 id 工作:

SELECT so.* 
FROM sys.objects so
INNER JOIN sys.partitions sp on so.object_id = sp.object_id
WHERE sp.partition_id = 72057594059489280

在此处输入图像描述

那么为什么我加入上面的原始语句时找不到表名呢?

sql-server sql-server-2012
  • 1 个回答
  • 3754 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve