标签: t-sql

使用“NOT IN”时性能不佳

在我的应用程序中,我有一个在“文件”表中执行搜索的查询。

该表filesf.created(参见表定义)进行分区,并为客户端 19 ( f.cid = 19)提供约 1 亿行。

我正在使用我上一个问题的答案中的这个查询, SQL Server 的慢顺序

WITH PartitionNumbers AS
(
    -- Each partition of the table
    SELECT P.partition_number
    FROM sys.partitions AS P
    WHERE P.[object_id] = OBJECT_ID(N'dbo.files', N'U')
    AND P.index_id = 1
)
SELECT
    FF.id,
    FF.[name],
    FF.[year],
    FF.cid,
    FF.created,
    vnVE0.keywordValueCol0_numeric
FROM PartitionNumbers AS PN
CROSS APPLY
(
    SELECT
        F100.*
    FROM 
    (
        -- 50 rows in order for year 2013
        SELECT
            F.id,
            F.[name],
            F.[year],
            F.cid,
            F.created
        FROM dbo.files …
Run Code Online (Sandbox Code Playgroud)

performance sql-server t-sql query-performance

6
推荐指数
2
解决办法
535
查看次数

每次在大表上运行查询很少更改的数据的替代方法

我有一个内部 Web 应用程序正在运行,每次用户转到“搜索”视图时,它都会查询数据库中的三个不同表,以生成视图中三个下拉列表的值。

它基本上运行一个

SELECT DISTINCT (PortName)
FROM Ports
ORDER BY PortName ASC
Run Code Online (Sandbox Code Playgroud)

但是该表包含约 10'000'000 行,并且负载非常重,这意味着页面的加载时间(由于加载数据下拉列表)可能会超过 10-15 秒。

那么,有没有更好的方法来做到这一点,例如以特定时间间隔运行一些脚本并在不同位置创建一个表/视图/任何内容,以便卸载查询大表,只是为了从 10'000 返回 80 行'000 在主表中?

sql-server optimization t-sql sql-server-2014

6
推荐指数
3
解决办法
2413
查看次数

如何在 T-SQL 中透视

我有一个我无法解决的问题。

我的查询是:

SELECT
    f.Title, p.StartOfShowing
FROM  
    PlayDates p 
INNER JOIN 
    PlayDateSections ps ON p.PlayDateId = ps.PlayDateId
INNER JOIN 
    Films f ON p.FilmId = f.FilmId
WHERE  
    DATEDIFF(d, p.StartOfShowing, '2018-04-30') = 0
Run Code Online (Sandbox Code Playgroud)

表的结果是这样的:

A Quiet Place                      2018-04-30 12:40
A Quiet Place                      2018-04-30 15:05
A Quiet Place                      2018-04-30 17:30
A Quiet Place                      2018-04-30 19:55
A Quiet Place                      2018-04-30 22:20
Avengers : Infinity War            2018-04-30 11:10
Avengers : Infinity War            2018-04-30 11:30
Avengers : Infinity War            2018-04-30 12:00
Avengers : Infinity War            2018-04-30 13:00 …
Run Code Online (Sandbox Code Playgroud)

sql-server pivot t-sql

6
推荐指数
1
解决办法
543
查看次数

SQL 查询问题(列中没有值的项目)

这是我需要用一些 T-SQL Magic 解决的难题,我尝试过但失败了。

这是其中之一,在我想到实际解决方案之前,我认为我可以在 3 分钟内使用一些 T-SQL 解决,但是当“橡胶遇到道路”时,我无法在脑海中想象正确的运算符来实现这个逻辑。

我想知道 Stack Exchange 社区中是否有人可以找到一个优雅的解决方案。我想通过使用临时表或游标的 3 或 4 个查询的组合,我可以找到解决方案,但它不会基于 SET...

我有一张看起来像这样的桌子(或多或少......)

CREATE TABLE Computers (
   ID               int IDENTITY(1,1),
   ComputerName     varchar(255),
   OS               varchar(255),
   AppName          varchar(255),
   AppVersion       varchar(10)
)
Run Code Online (Sandbox Code Playgroud)

因此,每一行都有一个计算机名称、一个操作系统值(可以是 Windows 7 或 Windows 10),然后是应用程序的描述(例如 AppName = "Notepad++", AppVersion = "7.5.6")

ComputerName   | OS           | AppName   | AppVersion
Computer 1     | Windows 7    | App 1     | 1.0
Computer 1     | Windows 7    | App 2     | 1.0
Computer 1     | Windows 7    | …
Run Code Online (Sandbox Code Playgroud)

t-sql select

6
推荐指数
1
解决办法
79
查看次数

查询以查找给定范围内包含 ASCII 字符的行

我正在使用另一个主题的一些脚本,但接受的答案不适用于我的所有数据场景。我会问我关于如何检查非 Ascii 字符的原始帖子的问题,但我还没有足够的声誉来评论或投票。

问题:

我的测试

我使用示例数据、其中一个答案中的存储过程以及用于演示该问题的查询创建了SQL Fiddle

查询 1:sample_table

-- Note: The "bad dash" row has char(150)

SELECT * FROM sample_table;

+-------------------+
|    DataColumn     |
+-------------------+
| test - good dash  |
| test – bad dash   |
+-------------------+
Run Code Online (Sandbox Code Playgroud)

查询2:其它答案约翰表示“坏破折号”行含有炭(150):

SELECT dbo.Find_Invalid_Chars(DataColumn) [Invalid Characters]
FROM sample_table
WHERE dbo.Find_Invalid_Chars(DataColumn) IS NOT NULL;

+----------------------+
|  Invalid Characters  |
+----------------------+
| test [150] bad dash  |
+----------------------+
Run Code Online (Sandbox Code Playgroud)

查询3: …

sql-server collation t-sql character-set encoding

6
推荐指数
1
解决办法
3502
查看次数

多个join的SQL查询执行计划的逻辑顺序

我知道执行 SQL 查询的逻辑顺序是:

FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE or WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
Run Code Online (Sandbox Code Playgroud)

如果查询中有多个连接会发生什么,例如,如果我们有这样的查询:

SELECT *
FROM user_branch T1
INNER JOIN dimcustomer2 T2
   ON T1.BRANCH_CODE = T2.BRANCH_CODE
INNER JOIN customer_guarantee T3
   ON T3.CUSTOMER_NUM = T2.CUSTOMER_NUM
Run Code Online (Sandbox Code Playgroud)

一些示例数据:

customer_guarantee:    CUSTOMER_NUM      BRANCH_CODE
                      -------------------------------
                           A                X
                           B                X
                           C                Y
                           D                Z



 user_branch:           USER_ID          BRANCH_CODE    
                      --------------------------------
                           U1               Y



 dimcustomer2:         CUSTOMER_NUM      BRANCH_CODE      
                      --------------------------------
                           A                Y
                           B                Y
                           C                Y
                           D                Z
Run Code Online (Sandbox Code Playgroud)

这将如何执行?哪个连接会先执行?如果查询中有不同类型的连接怎么办?在这种情况下执行连接的顺序是什么?提前致谢。

query t-sql sql-server-2016

6
推荐指数
2
解决办法
3983
查看次数

寻找缺失的逆关系

我正在为一个我觉得应该很简单的查询而苦苦挣扎,但我无法理解它。

我们有一个单独的表来保存不同方之间的关系。该表应该为每个关系包含一行。然而,我们注意到一些关系缺失了,我们想重建它们。基本上每个关系应该有两行,关系和逆。

所以,一张健康的桌子应该是这样的……

Id | PartyId | OtherPartyId | RelType | RelStatus
1   1111      2211            1         1
2   2211      1111            1         1
3   3344      4444            1         2
4   4444      3344            1         2
Run Code Online (Sandbox Code Playgroud)

但是,我们有这样的情况......

Id | PartyId | OtherPartyId | RelType | RelStatus
1   1111      2211            1         1
2   2211      1111            1         1
3   3344      4444            1         2
4   5555      2224            1         2
5   2224      5555            1         2
Run Code Online (Sandbox Code Playgroud)

方 3344 和 4444 之间的逆关系缺失,所以我只想返回该行,以便我可以插入逆关系。

'id' 列是无关紧要的,因为它只是一个标识列,但 RelType 和 RelStatus 很重要,因为它们对于反向关系需要相同 - 例如,在 …

sql-server t-sql

6
推荐指数
2
解决办法
348
查看次数

是否有更优化的方法来创建此视图或存储过程?目前使用交叉应用,但速度很慢

我用一些测试数据更新了这篇文章。

我正在为我的电影数据库创建一个报告,我希望最终用户能够选择某种类型的电影。然而,有些电影有多种类型,我已经规范化了数据库,以便具有多个类型的电影订单项变成多个订单项,每个订单项都指向相应的类型/类型 ID。(对于董事也做了类似的事情)。

标准化前

电影 类型
弗兰肯斯坦的新娘 恐怖、剧情

标准化后

电影 类型
弗兰肯斯坦的新娘 恐怖
弗兰肯斯坦的新娘 戏剧

我遇到的问题是,为了这份报告,我希望做到这样,如果电影有多种类型,那么它们就不会在报告中重复。相反,电影标题成为一个行项目,并且流派字段被连接起来以显示一行内的所有流派(类似于标准化之前的视图)。我最终要做的是创建一个视图,在其中按照与电影 ID 匹配的类型交叉应用电影选择的输出。我觉得我有点过于复杂了,而且我的商店程序运行得相当慢,因为我还有其他几个字段允许用户进行过滤。

下面是交叉应用视图。

ALTER VIEW [dbo].[vwMoviesJoinedGenres] AS

WITH genreMovies_CTE AS (
SELECT M.MovieID
    , M.MovieTitle
    , G.GenreName
    , G.GenreID
    , M.TitleTypeID
    , TT.TitleType
    , M.MediaID
    , M.IMDBLink
    , M.IMDBRating
    , M.ReleaseDate
    , M.Runtime
    , M.ImageURL
    , M.MovieYear
FROM [dbo].[Movies] AS M
INNER JOIN GenresMovies AS GM
    ON GM.MovieID = M.MovieID
INNER JOIN Genres AS G
    ON G.GenreID = GM.GenreID
INNER JOIN TitleType AS TT …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures optimization t-sql cross-apply

6
推荐指数
1
解决办法
437
查看次数

选择包含 NULL 的前 x 行之后的所有行

我有桌子src。在此表中,每个产品-国家/地区组合可能包含NULLCountry第一行的列中x

如何为每个产品-国家/地区组合提供行,仅包含“国家/地区”列中包含的SELECT第一行之后的行?对于后面的任何行也很重要,即使它们确实包含在“国家/地区”列中,只要在其之前至少有一行具有真实值即可。xNULLSELECTNULL

预期输出

例如。

  1. 对于产品 A,我想要ID 为 3 和 4SELECT的行,而不是 ID 1 和 2 的行。
  2. 对于产品 B,我想要ID 为 6 和 7SELECT的行,而不是 ID 5 的行。
ID 产品 国家 时间戳
3 A 2022-01-23 14:29:06.830
4 A 无效的 2022-01-24 14:29:06.830
6 CH 2022-01-23 14:29:06.830
7 无效的 2022-01-24 14:29:06.830

示例表和数据

create table dbo.src
(
    ID int not null
    ,Product varchar(2) not …
Run Code Online (Sandbox Code Playgroud)

sql-server query t-sql

6
推荐指数
2
解决办法
930
查看次数

使用另一个表中的最大值和最小值更新 T-SQL

我对 SQL 查询没有太多经验,我正在尝试从错误中学习和理解。我有两张桌子:

CREATE TABLE #TempTest
(Id INT,
Number INT)

CREATE TABLE #TempTest2
(Id INT,
MaxNo INT,
MinNo INT)

INSERT INTO #TempTest VALUES (1,4)
INSERT INTO #TempTest VALUES (1,6)
INSERT INTO #TempTest VALUES (1,9)
INSERT INTO #TempTest VALUES (1,7)
INSERT INTO #TempTest VALUES (1,3)
INSERT INTO #TempTest VALUES (1,1)
INSERT INTO #TempTest VALUES (1,5)

INSERT INTO #TempTest2 VALUES (1,0,10)
Run Code Online (Sandbox Code Playgroud)

我正在尝试更新MaxNo第一个表中最大数小于 8 且MinNo最小数大于 1 的列:

UPDATE t2
SET MaxNo = IIF(t1.Number>t2.MaxNo AND t1.Number<8,t1.Number, t2.MaxNo),
MinNo = IIF(t1.Number<t2.MinNo …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql update

6
推荐指数
1
解决办法
3550
查看次数