我正在使用基于两个表(表1和表2)的Join开发SQL查询.RDBMS是SQL Server。两个表都有一个共同的ID
列,基于该列将形成连接。两列中都有一个日期时间列。
目标:我想从Table2中检索Table2.datetime
在Table1.datetime
1分钟范围内的所有行。
注意:我没有数据库的写权限,因此索引不适合我。
我的查询正确。它运作正常;但是,数据库是巨大的。如果我想要检索过去15天的数据,则需要永久。
有更好的方法吗?
这是查询
SELECT
A.Column1, A.Column2,
A.Column3, A.Column4,
A.Column5, A.Column6,
A.Column7, A.Column8,
A.Column9, A.Column10, A.Column11,
B.Column1, B.Column2,
B.Column3, B.Column4, B.Column5
FROM
TABLE1 A, TABLE2 B
WHERE
A.CommonColumn = B.CommonColumn
AND B.DateTime BETWEEN DATEADD(minute, -1, A.DateTime)
AND DATEADD(minute, 1, A.DateTime)
AND A.DateTime BETWEEN GETDATE() - 15 AND GETDATE()
答案 0 :(得分:0)
在应用分钟条件之前,尝试先过滤数据以减少记录数 还为startDate和endDate定义变量,并在下面的查询中使用它们。(希望它有所帮助,或者给你一个想法) (我担心CTE的表现,但试试吧)
Declare @startDate Datetime =GetDate()-15;
Declare @endDate Datetime=GetDate();
;with filteredDataA as (
SELECT A.CommonColumn,A.DateTime,
A.Column1, A.Column2,
A.Column3, A.Column4,
A.Column5, A.Column6,
A.Column7, A.Column8,
A.Column9, A.Column10, A.Column11
FROM
TABLE1 A
where A.DateTime BETWEEN @startDate AND @endDate
),
filteredDataB as (
Select B.CommonColumn,B.DateTime,
B.Column1, B.Column2,
B.Column3, B.Column4, B.Column5
From Table2 B
where B.DateTime BETWEEN @startDate AND @endDate
)
Select A.Column1, A.Column2,
A.Column3, A.Column4,
A.Column5, A.Column6,
A.Column7, A.Column8,
A.Column9, A.Column10, A.Column11,
B.Column1, B.Column2,
B.Column3, B.Column4, B.Column5
from filteredDataA A left join filteredDataB B on A.commonColumn=B.CommonColumn
and B.DateTime BETWEEN DATEADD(minute, -1, A.DateTime)
AND DATEADD(minute, 1, A.DateTime)
答案 1 :(得分:0)
尝试更改第二个子句
WHERE
A.CommonColumn = B.CommonColumn
--AND B.DateTime BETWEEN DATEADD(minute, -1, A.DateTime)
-- AND DATEADD(minute, 1, A.DateTime)
AND ABS(DateDiff(mi, A.DateTime, B.DateTime)) <= 1
AND A.DateTime BETWEEN GETDATE() - 15 AND GETDATE()