标签: t-sql

SQL:查找匹配多行的唯一多列值三元组?

TL;DR:使用 Transact-SQL/SQL Server,如何找到表中与另一列中的某些值集的列值(ColA、ColB、ColC)的单个“解决方案”三元组相匹配的行?

更多信息:假设我有一个与此类似的表(为了获得焦点而删除了 ID 列):

火焰离子化检测器 可乐 科尔B 科尔C
1 1 1 1
1 2 2 2
2 1 1 1
2 3 3 3
3 1 1 1
3 2 2 2

我试图找到 FID 的每个值都存在的 (ColA、ColB、ColC) 的共同三元组值。在此示例中,(1, 1, 1) 将是该三元组,因此我想返回类似以下内容的内容:

火焰离子化检测器 可乐 科尔B 科尔C
1 1 1 1
2 1 1 1
3 1 1 1

感觉应该是某种使用的集合操作intersect,但我对如何最好地以声明方式对其进行建模和编码感到困惑。想法?非常感谢您的帮助!

澄清:几点希望有助于解释我的问题。

  1. 我正在寻找一个查询来查找三元组可能是什么。我不一定知道数据中的内容。
  2. 三元组值不依赖于 FID 值,反之亦然。我的示例恰好使用了与 FID 值之一匹配的 (1,1,1)。数据可能看起来更像是:
火焰离子化检测器 可乐 科尔B 科尔C
13 1 …

sql-server t-sql sql-server-2019

4
推荐指数
1
解决办法
1369
查看次数

这是有效的 SQL Server 更新语法吗?

今天我正在阅读一些很久以前做的数据库笔记。我看到了这个查询:

UPDATE Sales.Orders
SET (shipcountry, shipregion, shipcity)=
(SELECT country, region, city
FROM Sales.Customers AS C
WHERE C.custid =Sales.Orders.custid)
WHERE custid IN
(SELECT custid FROM Sales.Customers WHERE country = 'USA');
Run Code Online (Sandbox Code Playgroud)

我对这个语法真的很陌生。但我的注释说它是“有效的 SQL Server 更新语法”。这是真的?SSMS 无法解析它。当我尝试运行它时,我得到了这个:

在此输入图像描述

另外,SQL Server 的UPDATE文档似乎建议在关键字(之后不允许使用SET。无论如何,我只是想确认一下。

sql-server syntax t-sql update

4
推荐指数
1
解决办法
346
查看次数

在此版本的 SQL Server 中无法使用参数调用“SUSER_SNAME”

我正在阅读这篇博客文章,其中包含一个查询,可以让您找到 a 何时DROP被解雇。我更改LIKE 'DROPOBJ%'NOT LIKE 'DROPOBJ%'这样我可以返回更多行:

SELECT [Current LSN]
        ,[Operation]
        ,[Context]
        ,[Transaction ID]
        ,[Description]
        ,[Begin Time]
        ,[Transaction SID]
        ,[Transaction Name]
FROM fn_dblog (NULL,NULL)
INNER JOIN(SELECT [Transaction ID] AS tid
FROM fn_dblog(NULL,NULL)
WHERE [Transaction Name] NOT LIKE 'DROPOBJ%')fd ON [Transaction ID] = fd.tid
Run Code Online (Sandbox Code Playgroud)

该查询在 Azure SQL 数据库上轻松执行,但是当我尝试将SUSER_SNAME博客文章中所述的内容添加到代码中时:

SELECT [Current LSN]
        ,[Operation]
        ,[Context]
        ,[Transaction ID]
        ,[Description]
        ,[Begin Time]
        ,[Transaction SID]
        ,SUSER_SNAME ([Transaction SID]) AS WhoDidIt
FROM fn_dblog (NULL,NULL)
INNER JOIN(SELECT [Transaction ID] …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql azure-sql-database azure

4
推荐指数
1
解决办法
894
查看次数

表值函数对于插入顺序是否具有确定性?

假设不使用 ORDER BY 子句,在实例化表并用连续插入填充表的 TABLE 值函数中,插入顺序是否具有确定性?

我需要查看发送给我们的给定数据集中使用的 Unicode 字符范围,以便弄清楚为什么 SSMS 中的查询结果中的某些空格(或者至少在眼睛看来是空格)没有被使用。在某些解析例程中,其行为类似于 char(32)。因此,我编写了一个快速而肮脏的函数,将相关列中的字符串值转换为一组可以查询的元组:

create function [foo].[AllChars]
(@in nvarchar(max))
returns @t TABLE (c nchar(1))
as
begin


declare @i int;
while len(@in)>0
begin
   insert @t(c) values (left(@in,1));
   set @in = substring(@in, 2, len(@in)-1)
end

return;
end
Run Code Online (Sandbox Code Playgroud)

可以这样称呼:

   select X.c theChar, unicode(X.c) uValue
   from myTable T
   cross apply foo.AllChars(T.myCol) X
Run Code Online (Sandbox Code Playgroud)

并将为myTable中的每一行返回一组元组:

t  116
h  104
e  101
   32
c  99
a  97
t  116
   10   <= culprit
i  105
n  110
   32 …
Run Code Online (Sandbox Code Playgroud)

sql-server determinism t-sql set-returning-functions non-deterministic

4
推荐指数
1
解决办法
712
查看次数

观点在逻辑上是多余的吗?

今天早些时候,我意识到我犯了一个非常愚蠢的错误。我没有编写视图,而是编写了无参数内联表值函数。这让我思考:除了界面之外,两者之间有什么区别吗?据我所知,它们在逻辑上是相同的并且执行相同。

那么,换句话来说,视图提供了哪些无参数内联表值函数所没有的功能呢?我想到的只是索引视图,但我从未见过有人真正使用它们。

sql-server feature-comparison t-sql view functions

4
推荐指数
2
解决办法
2689
查看次数

过滤器连接或 Where 子句 TSQL

我应该将过滤器放在 TSQL 查询的什么位置?

SELECT a.colum FROM A 
JOIN B  ON A.ID =  B.ID AND B.STATUS  = 1
Run Code Online (Sandbox Code Playgroud)

或者

SELECT a.colum FROM A 
JOIN B  ON A.ID =  B.ID 
WHERE  B.STATUS  = 1
Run Code Online (Sandbox Code Playgroud)

我正在寻找性能问题或良好做法。

t-sql

3
推荐指数
1
解决办法
1718
查看次数

将 varchar 数据转换为日期时间失败

我们正在将数据从旧表(所有 varchar 字段)移动到强类型的对应提示中

作为这项工作的一部分,如果所有数据都可以正确转换为适当的类型,我们将从基础实体表中获取数据并将其转储到 Entity_New 中。否则,它将进入名为 Entity_Bad 的现有表的副本。

我们有一个规则引擎,可以在理论上验证数据和类型,因此即使数据存储在字符字段中,数据也应该是干净的。现实是我在这里发帖是因为有些事情已经过去了,我找不到了。Entity 中的 CompletionDate 字段是 varchar(46) NULL

环境是

productversion  productlevel   edition
10.0.4064.0     SP2            Enterprise Edition (64-bit)
Run Code Online (Sandbox Code Playgroud)

我的脚本展示了我在做什么以及什么在起作用但没有起作用

SET NOCOUNT ON

DECLARE
    @startid int = 0
,   @stopid int = 796833


-------------------------------------------------------------------------------
-- Check doesn't find anything wrong with CompletionDate
-------------------------------------------------------------------------------
SELECT
    1
FROM
    [dbo].[Entity] E
    INNER JOIN
        dbo.EntityBatch_New PB
        ON E.FiscalYear = PB.FiscalYear
            AND E.HashCode = PB.HashCode
            AND E.AAKey = PB.AAKey
            AND PB.ProcessResultCode IN ('A','W','M')
WHERE
    PB.EntityBatchId BETWEEN @StartId AND @StopId
    AND …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server t-sql datetime

3
推荐指数
1
解决办法
2322
查看次数

在 WHERE 中使用 COUNT(*) 的一些有效方法是什么

除了COUNT(*)使用WHERE子句调用之外,有什么方法可以使这项工作在服务器上更有效?我想对复杂的连接进行计数,只是想知道这样做的最佳方法。使用SET NOCOUNT OFF? 因为SET NOCOUNT ON在新的存储过程中默认启用,我猜是微软建议的。谢谢你。

performance sql-server-2008 sql-server t-sql query-performance

3
推荐指数
1
解决办法
192
查看次数

SQL Server 2008 R2 中的 AUTO_UPDATE_STATISTICS 和 FULLSCAN

是否可以强制SQL Server 2008 R2自动FULLSCAN更新统计信息?

如果没有,计划UPDATE STATISTICS WITH FULLSCAN是保持最新统计数据的最佳方式吗?

注意:FULLSCAN当使用非FULLSCAN统计时,需要通过证明次优计划生成来实现。

sql-server best-practices t-sql sql-server-2008-r2

3
推荐指数
1
解决办法
1794
查看次数

t-sql - 组合学

我正在尝试在可变长度字符串中找到所有可能的字符组合。

例如:“--”将有 2^n = 2^2 = 4 种可能性,“x-”、“-x”、“xx”、“--”

我认为基本上我需要循环 c(2,2) + c(2,1) + c(2,0) 其中 c(n,r) = n!/ (r! * (nr)!) 但是我在使用 cte 处理事情时遇到了麻烦。到目前为止,随着您向字符串添加字符,一切都开始崩溃了。

使用数字表 -

declare @s varchar(15)
set @s = '--'

;with subset as (
select cast(stuff(@s,number,1,'x') as varchar(15)) as token,
     cast('.' + cast(number as char(1)) + '.' as varchar(11)) as permutation,
     cast(1 as int) as iteration ,
     number
from numbers where number between 1 and len(@s)
union 
select @s, '.0.', 1, 0
) ,

combination as ( …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

3
推荐指数
1
解决办法
1552
查看次数