小编And*_*y M的帖子

从查询中检索特定结果

我有以下数据库表

Firstname  Varchar(40)
Surname    Varchar(40)
Department Binary
JobCode    Char(1)
Run Code Online (Sandbox Code Playgroud)

通常情况下,提取特定部门的记录是没有问题的。部门字段是一个由 7 部分组成的字段,每一位代表一个特定的部门,允许系统轻松显示人们在一个或多个部门工作的位置。假设 John Smith 的工作代码为 K,而 Freda Williams 的工作代码为 M。

同样,返回特定部门的记录非常简单。但是,如果 John Smith 临时晋升到同一部门,而不是更改记录,则会添加一个带有职位代码 F的额外记录。本质上,职位代码字母越低,等级越高。

因此,如果我们要检索 John Smith 的当前详细信息,很简单,选择姓名为 John Smith 的记录,按 Job Code Asc, Limit (1) 排序。

但是,提取一个部门的所有记录的 SQL 语句是什么,但要确保John Smith只出现一个记录,而且它是“F”记录?任何人都可以帮忙吗?我原以为子查询可能会对它进行排序,但不知道如何排序。

mysql select

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

选择层次结构中的所有子级

我有一个像这样的分层数据表:

BookGroupID  GroupName  ParentGroupID
-----------  ---------  -------------
0            Primary    0
1            abc        0
2            abd        0
3            abe        0
4            cbc        1
5            ceg        2
6            cjd        3
7            hjd        5
8            bjy        5
9            mfs        4
10           ikl        7
11           hjy        8
12           mnf        5
13           aws        10
14           qws        11
15           aqe        13
Run Code Online (Sandbox Code Playgroud)

我想在层次结构中选择一个特定的 BookGroupID 及其所有直接和间接子级。例如,对于 2 的 BookGroupID,输出应如下所示:

BookGroupID
-----------
2
5
7
8
10
11
12
13
14
15
Run Code Online (Sandbox Code Playgroud)

解释一下,第 5 行在输出中,因为它是第 2 行的直接孩子,第 7、8 和 …

sql-server-2005 sql-server recursive

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

比较行值

我是 SQL 新手,希望得到一些帮助。

这是我的表:

ID  Name  Number  Src_Call_Leg  Dest_Call_Leg
--  ----  ------  ------------  -------------
1   John  5555    100           1000
2   John  5555    100           102
Run Code Online (Sandbox Code Playgroud)

该表存储呼叫记录。当呼叫 5555 时,系统首先接受源呼叫支路 100 和目的地呼叫支路 1000 以及最终目的地呼叫支路 102,然后由 John 应答。源调用段在整个过程中没有变化。

我想要的是仅显示具有名称、号码、源呼叫支路和最终目的地呼叫支路的数据,以记录临时呼叫支路以 1000 开头的记录。

我尝试这样做,但没有用。这是我的尝试:

select
  tb.name,
  tb.number,
  tb.Src_Call,
  tb.Dest_Call_leg
from
  table tb
where
  tb.Src_Call_Leg IN (
    select
      tb1.Src_Call_Leg
    from
      table tb1
    where
      tb1.Dest_Call_Leg like '1000%'
  );
Run Code Online (Sandbox Code Playgroud)

我知道我在做一些非常愚蠢的事情,如果有人能指出这一点,我将不胜感激。

subquery

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

索引临时表

当在估计的执行计划中建议这样做时,在临时表上应用索引是否是个好主意?

index sql-server temporary-tables

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

SSMS 生成的存储过程脚本中的脚本日期有什么意义?

当我生成存储过程脚本时,SSMS 还会生成一个包含对象名称和脚本日期时间戳的注释:

在此处输入图片说明

时间戳只是生成脚本时的当前时间,我试图理解它的意义。

我可以看到 SSMS 包括一个自动功能,用于捕获存储过程的创建、上次更新或运行时间。其中任何一个都可能对程序员的日常活动有用。但是,包括查看它的时间有什么意义呢?

我试过在互联网上寻找答案,但没有任何有用的东西出现。

stored-procedures ssms scripting timestamp

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

如何在没有提示的情况下强制合并连接

前段时间我使用了查询提示,但后来意识到大多数时候 SQL Server 比我更聪明。 构建额外的索引/重新组织数据或查询并获得比强制服务器使用计划要好得多的结果这通常效率低下,但对于某些数据子集来说速度足够快。但现在我处于一种我不知道如何更好地组织数据的情况。

我有两张桌子。第一个表 T1 是 (Id, CustomerId),第二个表 T2 具有相同的列。我想在 CustomerId 上加入 T1 到 T2。并获得前 N 行。在这种情况下,优化器看到我只需要 N 个 top 并说,“嘿,我将使用循环并很快找到 N 个匹配项,尤其是当我使用索引查找时。” 但它不起作用,因为没有满足条件的数据。因此它使用 aloop join来连接一个 25m 的表和一个非常慢的 100k 表。

在此处输入图片说明

当我强制 SQL Server 使用合并联接时,我得到以下计划,该计划在一秒钟内执行:

在此处输入图片说明

我不想强迫它有两个原因:

  • 首先,正如我之前所说,SQL Server 足够智能。
  • 其次,我使用的是 ORM,并且很难在生成的查询中注入提示,所以我想避免它。

在这种情况下我该怎么办?

join sql-server optimization t-sql execution-plan

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

外键和数据导入

我有:

  • 一个 CSV 文件(5000 多条记录);
  • 一张空item桌子;
  • favourite桌;
  • 一些其他空表。

我想item用 CSV 文件的内容填充表格。然后我想在两个表之间创建一些外键关系。

我按什么顺序执行此操作?

每次尝试此操作时,我都会收到错误消息:

#1452 - Cannot add or update a child row: a foreign key constraint fails...
Run Code Online (Sandbox Code Playgroud)

请注意,我的空favourite表已经设置了一些外键约束。我正在使用 PhpMyAdmin 和 MySQL Workbench。

设置外键关系之前,我是否应该让所有表都填充数据?或者我是否建立关系然后填充数据?

mysql foreign-key phpmyadmin

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

字段日期部分的索引?

我有一个日期时间字段,但我经常查询日期部分,如下所示

select * from table where date(datetime_field)=curdate()
Run Code Online (Sandbox Code Playgroud)

此查询不能在 datetime_field 上使用索引!对代码或数据库进行最少更改的最佳解决方案是什么?

附言。如果有我还不知道的解决方案,升级 mysql 可能是一个选择,但 5.6 的更短期解决方案将不胜感激

mysql index mysql-5.6

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

空结果集和 Case When = 1

我很确定这是一个隐式转换,但我无法找到有关它的信息。

假设我有这个 SQL:

SELECT
CASE WHEN (SELECT 1 WHERE (1=1)) = 1 THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)

我的子查询返回一行,因此与 1 进行比较。这导致我的 CASE WHEN 产生 1 输出。

即使我将子查询设置为不返回如下示例所示的行,CASE 语句也会返回 0 结果:

SELECT
CASE WHEN (SELECT 1 WHERE (1=0)) = 1 THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)
  • SQL 解释器是否在“空集”到 0 或 1 之间进行转换?
  • 使用这种类型的比较让我感到不舒服。以我的拙见,最好像这样使用 EXISTS:

    SELECT
    CASE WHEN EXISTS(SELECT 1 WHERE (1=1)) THEN 1 ELSE 0 END
    
    Run Code Online (Sandbox Code Playgroud)

如果我不使用 EXISTS 有什么优点或缺点吗?

sql-server case

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

从视图生成 SQL 表 DDL

如何在一个脚本中从视图生成表结构?只需要数据类型,我正在寻找具有某种类型的动态 sql 的表创建脚本

(1) 可以删除主键/约束,

(2) 不在乎是否添加了 null/not null(但是如果有的话会很好)

我在下面提出了示例问题/答案,请随时对未包含在表中的其他数据类型进行代码审查、编辑/优化,特殊情况/问题/例外可能没有考虑在内。顺便说一下,是否有任何开源代码?

表 1 和 2:

create table dbo.Customer
(
     CustomerId int primary key,
     CustomerName varchar(255),
     ZipCode varchar(9)
)
create table dbo.CustomerTransaction
(
     CustomerTransactionId int primary key identity(1,1),
     CustomerId int,
     SalesAmount numeric (10,2),
     PurchaseDate datetime
)
Run Code Online (Sandbox Code Playgroud)

看法:

create view dbo.CustomerTransactionVw
as
select 
     ct.CustomerTransactionId,
     ct.SalesAmount,
     ct.PurchaseDate,
     cust.CustomerId,
     CustomerName,
     cust.ZipCode
from dbo.CustomerTransaction ct
inner join dbo.Customer cust
  on cust.CustomerId = ct.CustomerId
Run Code Online (Sandbox Code Playgroud)

预期的表创建脚本:

create table dbo.CustomerTransactionBigTable
(
     CustomerTransactionId int identity(1,1),
     CustomerId int,
     SalesAmount numeric (10,2), …
Run Code Online (Sandbox Code Playgroud)

sql-server view dmv sql-server-2016

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