SQL:选择没有连接的2个表

时间:2016-05-26 19:21:17

标签: sql sql-server-2008

我写了这个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抱歉不完整的帖子,但我在工作,他们正在踢我关闭: - )

2 个答案:

答案 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可以显着缩短执行时间。