在我的应用程序中,我有一个在“文件”表中执行搜索的查询。
该表files按f.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) 我有一个内部 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 在主表中?
我有一个我无法解决的问题。
我的查询是:
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) 这是我需要用一些 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) 我正在使用另一个主题的一些脚本,但接受的答案不适用于我的所有数据场景。我会问我关于如何检查非 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)
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 查询的逻辑顺序是:
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)
这将如何执行?哪个连接会先执行?如果查询中有不同类型的连接怎么办?在这种情况下执行连接的顺序是什么?提前致谢。
我正在为一个我觉得应该很简单的查询而苦苦挣扎,但我无法理解它。
我们有一个单独的表来保存不同方之间的关系。该表应该为每个关系包含一行。然而,我们注意到一些关系缺失了,我们想重建它们。基本上每个关系应该有两行,关系和逆。
所以,一张健康的桌子应该是这样的……
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 很重要,因为它们对于反向关系需要相同 - 例如,在 …
我用一些测试数据更新了这篇文章。
我正在为我的电影数据库创建一个报告,我希望最终用户能够选择某种类型的电影。然而,有些电影有多种类型,我已经规范化了数据库,以便具有多个类型的电影订单项变成多个订单项,每个订单项都指向相应的类型/类型 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) 我有桌子src。在此表中,每个产品-国家/地区组合可能包含NULL在Country第一行的列中x。
如何为每个产品-国家/地区组合提供行,仅包含“国家/地区”列中包含的SELECT第一行之后的行?对于后面的任何行也很重要,即使它们确实包含在“国家/地区”列中,只要在其之前至少有一行具有真实值即可。xNULLSELECTNULL
预期输出
例如。
SELECT的行,而不是 ID 1 和 2 的行。SELECT的行,而不是 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 查询没有太多经验,我正在尝试从错误中学习和理解。我有两张桌子:
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) t-sql ×10
sql-server ×8
optimization ×2
query ×2
collation ×1
cross-apply ×1
encoding ×1
performance ×1
pivot ×1
select ×1
update ×1