2011-07-27 10 views
1

最近SQL StudioからOracleにデータベースを移動しなければならなかったので、使用する必要があるすべての構文について学習しています。Oracle SQL Developer - 2つのテーブルを同時に照会できない

とにかく私は実行しようとしているクエリが永遠に(> 15分)実行され、決して終了しないような問題に遭遇しました。

ご覧のとおり、Withステートメントを使用して2つのtempを作成します。私のクエリを実行するテーブル。これらのテーブルのいずれかを個別に照会すると、結果は< 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 
; 

を今、私は声明からに他のテーブルを追加する場合、私はどこか他の(選択し、どこで、など)クエリはdoesnのそれを使用していないにもかかわらず、何もしない。実行して実行します。

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で正常に機能しました。

あなたがすべてでそれを含めて、しかし、あなたはちょうどこの例では、それらを含めていないと仮定している理由は、最終的なselectAssyQCから任意の列をなし

答えて

3

、私は表示されません、テーブルを結合してみてください。

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を実行します。結果セットが大きい場合、クエリが長時間実行される可能性があります。

つまり、最初の表の各行と2番目の表の各行を組み合わせた行が生成されます。

+0

マイクとジェフのおかげです。それは私の見解であった。私はもともとWhere句を2つのテーブルにまとめていましたが、別の構文問題の根本原因を見つけようとしました。それから、この問題を解決しようとしているときにそれを戻すのを忘れてしまった。 実際のクエリは、両方のテーブルを使用するselectステートメントにもっと多くの情報を持っています。 – AFJ

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; 
+0

Where句Jeffに関するヒントをありがとう。私はあなたがFrom句に全体のクエリを入れることができないことを知り、これを行う唯一の方法はWhereステートメントを使用することであると考えました。 これを使って簡単にできるかどうか確認します。 – AFJ

関連する問題