我写了这个SQL查询:
SELECT *
FROM
dbo.RDB_LOG_ITEM,
(
SELECT '000' + CAST(operatore as varchar) + cast(scontrino as varchar) search
FROM
(
SELECT
N0_XACT_NO scontrino,
N0_OPERATOR_NO operatore
FROM
dbo.RDB_SCALE_ITEM
WHERE
BL_RECORD_EXPLODED = 0 AND
N0_COUNTER_NO = 1 AND
DT_TIME_STAMP LIKE '20160526%'
) db
) db2
WHERE
DT_TIME_STAMP > '2016-05-26T00:00:00.000' AND
SZ_SCALE_LABEL LIKE db2.search + '%'
但是此查询将在3秒内执行。此查询的结果是单行。 select db2
的结果只有7行。
我认为当我使用from data1,db2
时,SQL会进行交叉连接(data1是一个大型数据库,类似于300k +行)并且会减慢进程。
如果我尝试使用第二次选择的结果写入选择硬编码,我会在0.01秒内得到结果:select * from data1 where DT_TIME_STAMP > '2016-05-26T00:00:00.000' and SZ_SCALE_LABEL like '0001013530%'
如何在不加入其他数据库的情况下使用db2
?
编辑
子查询:
(
SELECT '000' + CAST(operatore as varchar) + cast(scontrino as varchar) search
FROM
(
SELECT
N0_XACT_NO scontrino,
N0_OPERATOR_NO operatore
FROM
dbo.RDB_SCALE_ITEM
WHERE
BL_RECORD_EXPLODED = 0 AND
N0_COUNTER_NO = 1 AND
DT_TIME_STAMP LIKE '20160526%'
) db
) db2
给我X行像
0001013530
0001013531
0001013532
0001013533
0001013534
我需要的是像select * from dbo.RDB_LOG_ITEM where DT_TIME_STAMP > '2016-05-26T00:00:00.000' and (SZ_SCALE_LABEL like '0001013530%' or SZ_SCALE_LABEL like '0001013531%' or SZ_SCALE_LABEL like '0001013532%' or SZ_SCALE_LABEL like '0001013533%' or SZ_SCALE_LABEL like '0001013534%')
我认为是子查询IN http://www.dofactory.com/sql/subquery附近但是LIKE
PS抱歉不完整的帖子,但我在工作,他们正在踢我关闭: - )
答案 0 :(得分:0)
首先,您应该使用显式JOIN
。您的WHERE
子句不应该有多个表(在这种情况下,将子查询视为“表”)。
其次,这里根本不需要子查询。在编写SQL时,你需要摆脱依赖子查询的习惯并以基于集合的方式思考。
最后,使用别名为查询中的所有列添加前缀。如果没有为它们添加前缀,就无法确定这些列的来源。
我相信这会给你带来相同的结果,理想情况下会以高效的方式完成。如果不是,那么您需要发布完整的表结构(包括索引)以及任何人的查询计划,以便能够帮助您解决性能问题。
SELECT
LI.dt_time_stamp,
LI.sz_scale_label,
<list other columns here, because we **never** use SELECT *>
FROM
dbo.RDB_LOG_ITEM LI
INNER JOIN dbo.RDB_SCALE_ITEM SI ON
SI.bl_record_exploded = 0 AND
SI.no_counter_no = 1 AND
SI.dt_time_stamp LIKE '20160526%' AND -- You should be using date datatypes for your date columns
LI.sz_scale_label LIKE '000' + CAST(operatore AS VARCHAR(20)) + cast(scontrino AS VARCHAR(20)) + '%' -- I guessed on appropriate VARCHAR sizes, which you should have
WHERE
LI.dt_time_stamp > '2016-05-26T00:00:00.000'
答案 1 :(得分:0)
您的表格有多少数据?如果他们有大量数据,没有加入你的执行时间会更多。我有类似的经历。使用join可以显着缩短执行时间。