标签: t-sql

SQL 查找字段的部分重复项

我有一个表,其中包含一个成员编号字段。该表可以包含该字段具有重复值的记录,并且确实如此。

我有一个 SQL 查询,它将获取该字段的任何重复值,但是,我现在想查找具有相同成员编号的另一条记录但只有 9 个数字中的前 8 个数字的记录。

例如,我想在查询运行时返回以下内容;

MEMBNO
123456789
123456782
Run Code Online (Sandbox Code Playgroud)

目前,我的查询只返回;

MEMBNO
123456789
Run Code Online (Sandbox Code Playgroud)

有两个或多个具有此确切数字的记录。

当前查询是;

SELECT
  basic.MEMBNO
FROM
  basic
GROUP BY
  basic.MEMBNO
HAVING
  COUNT(basic.MEMBNO) >1
ORDER BY
  basic.MEMBNO
Run Code Online (Sandbox Code Playgroud)

我认为可能有效的查询是;

SELECT
  basic.MEMBNO
FROM
  basic
GROUP BY
  basic.MEMBNO
HAVING
  COUNT(LEFT(basic.MEMBNO,8)) >1
ORDER BY
  basic.MEMBNO
Run Code Online (Sandbox Code Playgroud)

总的来说,我对 SQL 和数据库不太熟悉,所以如果我没有很好地解释自己,我深表歉意。它是否需要在某处使用 LIKE 运算符?

我正在使用 Microsoft SQL Server 报表生成器 3.0。

sql-server-2008 sql-server t-sql

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

对不同的表执行相同的SQL语句

我有一个从多个表中删除数据的存储过程。除了表名外,SQL 都是一样的。

UPDATE desttable
SET desttable.reportarea = esz2reportarea.reportarea
FROM table1 AS desttable JOIN esz2reportarea ON desttable.subdivisn = esz2reportarea.esz
WHERE desttable.reportarea = ''

UPDATE desttable
SET desttable.reportarea = esz2reportarea.reportarea
FROM table2 AS desttable JOIN esz2reportarea ON desttable.subdivisn = esz2reportarea.esz
WHERE desttable.reportarea = ''

...

UPDATE desttable
SET desttable.reportarea = esz2reportarea.reportarea
FROM table10 AS desttable JOIN esz2reportarea ON desttable.subdivisn = esz2reportarea.esz
WHERE desttable.reportarea = ''
Run Code Online (Sandbox Code Playgroud)

我想重写它以使用某种循环,以便 SQL 只编写一次。(这是针对 SQL Server 2008R2。)

需要更新的表列表将保持不变;如果要更新的表列表有任何更改,那将是由于应用程序升级,我必须重新确定当时需要修改哪些表。要更新的表列表将放入临时表中。

SELECT * INTO #tablenames
FROM (VALUES ('table1'), ('table2'), ('table3')) AS …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2

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

NOT IN(与连接一起)查询

我有两张桌子: PartOrderLine

Part (PartNum PK, PartDesc, Price)

OrderLine (OrderNum PK, PartNum PK, QtyOrdered)
Run Code Online (Sandbox Code Playgroud)

我想找出订购的零件。我想我有一个好主意,但我可能遗漏了一些东西;我认为最有可能在语法上。请检查:

select Part.PartNum
    ,OrderLine.OrderNum
from OrderLine
inner join Part on OrderLine.PartNum = Part.PartNum
where PartNum not in (
        select distinct (OrderNum)
        from OrderLine
        )
Run Code Online (Sandbox Code Playgroud)

这样对吗?

join sql-server t-sql sql-server-2014

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

引用临时表时是否会自动创建临时表?

我遇到了以下脚本,我试图理解它。

select columnA, columnB, columnC
  into #tmpTable
  from tableA
Run Code Online (Sandbox Code Playgroud)

#tmpTable该查询后,但在此之前没有被引用。#tmpTablesql 脚本中的任何地方都没有声明。

我有点笼统的问题是:

上面会自动创建临时表吗?为什么?这仅适用于 T-SQL 还是普遍适用?

t-sql temporary-tables

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

按照印度财政年度的 DayOfYear

我想根据印度财政年度得到一个序列号。我尝试使用 SQL 内置函数编写一个函数:

DATEPART(DAYOFYEAR,'2015-04-01')

但我面临着在整个财政年度获得天数的挑战。

对于 2015 财政年度:第一天是“2015-04-01”,最后一天是“2016-03-31”。

注意:对于这个时期,我的财政年度 2015 是闰年,应该有 366 天。

sql-server t-sql

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

如何优化这个棘手的 SQL 自连接?

我想对表执行复杂的自联接。我知道理论上这可以非常有效地完成(见下文),但我无法让 SQL(在 Microsoft SQL Server 上)这样做。

我的问题是:

我怎样才能让 SQL 有效地做到这一点?我需要提供哪些信息才能推断出最佳解决方案或类似的快速解决方案?

输入:

我有一个事件表。每个事件都属于某个项目,并且具有两种类型之一。我可以随意使用这个表,并创建我想要的任何索引,因为它是一个中间表。它也仅用于离线处理,因此以后不会添加新数据。

该表有数亿行。type=0 的条目和 type=1 的条目大致以相同的频率出现,并且它们或多或少是公平的分布,因为输入数据是按照某些规则创建的,因此可以假设以下情况为真对于数据:每次type=0发生事件时,涉及的项目的计数器增加,每次type=1发生事件时,它再次减少。计数器将始终介于 0 和 3(含)之间。

该表目前看起来像这样,但您可以随时提出更改建议:

select
    a.item
    ,case when a.<some_condition> then 1 else 0 end as event_type
    ,row_number() over(partition by a.item order by a.date asc) as sequence_id -- this makes the order clearer and deals with duplicate dates in a manner that is acceptable for these purposes
    ,<...> as counter_after_event -- this lies in [1;3] if event_type=0, and in [0;2] if …
Run Code Online (Sandbox Code Playgroud)

performance sql-server t-sql sql-server-2014 query-performance

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

查询表中列出的所有数据库

我一直在使用游标来获取结果,但是返回结果集需要很长时间。我希望找到一种方法来快速返回结果(如果可能的话)。这是我的带有垃圾 DDL 的数据结构。

第一个问题是每个员工都有自己的桌子。我知道这是一个主要的设计缺陷,我们正在迅速解决这个问题,但在所有元素都更新之前我需要一个替代方案。所有 3 个表geoffrey, jorge, mitch都具有相同的结构,我附上了示例 DDL geoffrey, & jorge,下面是一个示例查询,显示了我需要从两个表中的每一个查询的内容。

非常感谢有关如何实现这一结果的任何帮助!

Create Table #ReviewDB
(
  [TableName] varchar(500)
  ,[ServerDBTable] varchar(MAX)
)
Insert Into #ReviewDB VALUES
('geoffrey', 'beans.franks.dbo.geoffrey')
,('jorge', 'smallpox.virus.dbo.jorge')
,('mitch', 'mosquito.insect.dbo.mitch')
Create Table #geoffrey
(
  recordID int IDENTITY(1,1) PRIMARY KEY
  ,firstname varchar(500)
  ,lastname varchar(500)
  ,address varchar(500)
  ,city varchar(500)
  ,state varchar(500)
  ,zip varchar(500)
  ,phone varchar(500)
  ,itemsold varchar(500)
  ,saledate datetime
  ,managerapproved varchar(500)
)
Insert Into #geoffrey VALUES
('manny', 'ramirez', '1111111 aoaswdfrljkasdf ', 'topaz', 'mn', '1111', '9995552222', …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2

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

DBCC CHECKDB LastKnownGood

我创建了以下查询来列出服务器上所有数据库的 DBCC CHECKDB LastKnownGood 时间戳。有一个更好的方法吗?

IF OBJECT_ID(N'tempdb..#Results') IS NOT NULL
BEGIN
    DROP TABLE #Results
END

CREATE TABLE #Results (ParentObject varchar(100), Object varchar(100), Field varchar(100), Value varchar(100))
GO

INSERT INTO #Results
EXEC sp_msForEachdb @command1 = 'DBCC DBINFO (''?'') WITH TABLERESULTS'

ALTER TABLE #Results ADD ID INT IDENTITY(1, 1)
GO -- required here

SELECT r.Value as [Database], r2.Value as CheckDB_LastKnownGood
FROM #Results r
INNER JOIN #Results r2
ON r2.ID = (SELECT MIN(ID) FROM #Results WHERE Field = 'dbi_dbccLastKnownGood' AND ID > r.ID) …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql dbcc-checkdb

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

msdb.dbo.sysjobs 和上次运行日期和时间

我知道 last_run_date 和 last_run_time 存储为 Int,但是当转换到 datetime(我有示例)时,是 GMT 时间还是什么?转换后,它与 GUI 日志历史记录显示的时间不匹配。

任何人都可以提供这方面的指导吗?

这是我将值转换为日期时间值的 t-sql 代码:

'last run literal' = dateadd(millisecond, 
    sjs.last_run_time,
    convert(datetime,cast(nullif(sjs.last_run_date,0) as nvarchar(10))))
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server t-sql

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

exec(sql) 的安全替代方案

我发现exec(sql)代码中隐藏了一些语句。它们存在是有充分理由的,因为这些语句不能直接编写,但它们是一个明显的攻击媒介。

有没有安全的替代品exec(some sql)?将正确参数化的东西,包括语句中的表名?

security sql-server sql-injection dynamic-sql t-sql

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