我最近不得不将我的数据库从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中运行良好。
任何想法??
答案 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;