Oracle SQL Developer - 无法同时查询2个表

时间:2011-07-27 00:19:10

标签: sql oracle

我最近不得不将我的数据库从SQL Studio移到Oracle,我正在学习必须使用的所有不同语法。

无论如何,我今天遇到了一个问题,我试图执行的查询将永远运行(> 15分钟)并且似乎永远不会完成。

如您所见,我使用With语句创建2个临时值。从中运行查询的表。如果我单独查询这些表中的任何一个,我得到< 2秒。一旦我在From语句中添加了另一个表,它似乎什么也没做。

此查询正常工作:

With Laser as
(
SELECT Data.Serial_Number, Equipment.Equipment_Desc, Data.SCAN_TIME,
       ROW_NUMBER() OVER (PARTITION BY Data.Serial_Number, Equipment.Equipment_SN 
                              ORDER BY Equipment.Equipment_SN) AS RN
FROM Data, Equipment
where Data.Equipment_Station = Equipment.Equipment_SN and Equipment.Equipment_Desc like '%laser Etch%'
)

,AssyQC AS
(
SELECT Data.Serial_Number, Equipment.Equipment_Desc,Data.SCAN_TIME,
       ROW_NUMBER() OVER (PARTITION BY Data.Serial_Number, Equipment.Equipment_SN 
                              ORDER BY Equipment.Equipment_SN) AS RN
FROM Data, Equipment
where Data.Equipment_Station = Equipment.Equipment_SN and Equipment.Equipment_Desc like '%QSMC SI%'
)

select to_char(Laser.SCAN_TIME, 'mm') as "Laser Month", to_char(Laser.SCAN_TIME, 'dd') as "Laser Day"

from Laser
;

现在,如果我将另一个表添加到From语句中,即使我不在其他地方使用它(select,where等),查询也不会执行任何操作。它运行并运行并运行......

With Laser as
(
SELECT Data.Serial_Number, Equipment.Equipment_Desc, Data.SCAN_TIME,
       ROW_NUMBER() OVER (PARTITION BY Data.Serial_Number, Equipment.Equipment_SN 
                              ORDER BY Equipment.Equipment_SN) AS RN
FROM Data, Equipment
where Data.Equipment_Station = Equipment.Equipment_SN and Equipment.Equipment_Desc like '%laser Etch%'
)

,AssyQC AS
(
SELECT Data.Serial_Number, Equipment.Equipment_Desc,Data.SCAN_TIME,
       ROW_NUMBER() OVER (PARTITION BY Data.Serial_Number, Equipment.Equipment_SN 
                              ORDER BY Equipment.Equipment_SN) AS RN
FROM Data, Equipment
where Data.Equipment_Station = Equipment.Equipment_SN and Equipment.Equipment_Desc like '%QSMC SI%'
)

select to_char(Laser.SCAN_TIME, 'mm') as "Laser Month", to_char(Laser.SCAN_TIME, 'dd') as "Laser Day"

from Laser, AssyQC
;

此查询在SQL Studio中运行良好。

任何想法??

2 个答案:

答案 0 :(得分:3)

在最终AssyQC中没有来自select的任何列,我不明白为什么你要包含它,但假设你在这个例子中没有包括它们,请尝试加入表:

With Laser as
(
SELECT Data.Serial_Number, Equipment.Equipment_Desc, Data.SCAN_TIME,
       ROW_NUMBER() OVER (PARTITION BY Data.Serial_Number, Equipment.Equipment_SN 
                              ORDER BY Equipment.Equipment_SN) AS RN
FROM Data, Equipment
where Data.Equipment_Station = Equipment.Equipment_SN and Equipment.Equipment_Desc like '%laser Etch%'
)

,AssyQC AS
(
SELECT Data.Serial_Number, Equipment.Equipment_Desc,Data.SCAN_TIME,
       ROW_NUMBER() OVER (PARTITION BY Data.Serial_Number, Equipment.Equipment_SN 
                              ORDER BY Equipment.Equipment_SN) AS RN
FROM Data, Equipment
where Data.Equipment_Station = Equipment.Equipment_SN and Equipment.Equipment_Desc like '%QSMC SI%'
)

select to_char(Laser.SCAN_TIME, 'mm') as "Laser Month", to_char(Laser.SCAN_TIME, 'dd') as "Laser Day"

from Laser, AssyQC
where
    Laser.Serial_Number = AssyQC.Serial_Number
;

当你的from子句中有多个表而没有加入它们时,你正在做一个隐式的cross join,如果你的结果集很大,会导致查询运行很长时间;来自维基百科:

  

换句话说,它会产生一些行,它们将第一个表中的每一行与第二个表中的每一行组合在一起。

答案 1 :(得分:1)

正如@Mike所说,看起来你错过了一个联接。

您使用“With”语法是否有特殊原因?

我可能错了,但看起来你不需要这个查询的这个功能。对我来说,阅读起来比较困难,需要更多的时间来维持。

这个版本会有帮助吗?

SELECT to_char(Laser.SCAN_TIME, 'mm') as "Laser Month", 
       to_char(Laser.SCAN_TIME, 'dd') as "Laser Day"
FROM ( SELECT Data.Serial_Number, 
              Equipment.Equipment_Desc, 
              Data.SCAN_TIME,
              ROW_NUMBER() OVER (PARTITION BY Data.Serial_Number, Equipment.Equipment_SN ORDER BY Equipment.Equipment_SN) AS RN
        FROM  Data, 
              Equipment
        WHERE Data.Equipment_Station = Equipment.Equipment_SN 
          AND Equipment.Equipment_Desc like '%laser Etch%') laser,
     ( SELECT Data.Serial_Number, 
              Equipment.Equipment_Desc,
              Data.SCAN_TIME,
              ROW_NUMBER() OVER (PARTITION BY Data.Serial_Number, Equipment.Equipment_SN ORDER BY Equipment.Equipment_SN) AS RN
       FROM   Data, 
              Equipment
       WHERE Data.Equipment_Station = Equipment.Equipment_SN and Equipment.Equipment_Desc like '%QSMC SI%') AssyQC
WHERE laser.serial_number = assyQC.serial_number;