Oracle SQL Developer - невозможно запросить 2 таблицы одновременно - PullRequest
1 голос
/ 27 июля 2011

Мне недавно пришлось перенести свою базу данных из 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, хотя я не использую ее где-либо еще (выберите, где и т. Д.), Запрос ничего не сделает. Он бежит и бежит и бежит ...

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 ]

3 голосов
/ 27 июля 2011

Без каких-либо столбцов из 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 без их объединения, вы делаете неявное перекрестное объединение , которое, если ваши результирующие наборы большие, может заставить запрос выполняться долго ; из википедии:

Другими словами, он создаст строки, которые объединяют каждую строку из первой таблицы с каждой строкой из второй таблицы.

1 голос
/ 27 июля 2011

Как указано @Mike, похоже, что вы пропустили соединение.Есть ли конкретная причина, по которой вы используете синтаксис «С»?

Я могу ошибаться, но, похоже, вам не нужна эта функция для этого запроса.Для меня это сложнее читать, и это потребует больше времени для поддержания в течение долгого времени.Поможет ли эта версия?

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...