SQL: Превратить подзапрос в объединение. Как обратиться к внешней таблице в предложении вложенного объединения where? - PullRequest
0 голосов
/ 18 июля 2011

Я пытаюсь изменить свой подзапрос на объединение, где он выбирает только одну запись в подзапросе.Похоже, что для каждого найденного файла запускается подзапрос, выполнение которого занимает более минуты:

select afield1, afield2, (
    select top 1 b.field1
    from   anothertable as b
    where  b.aForeignKey = a.id
    order by field1
) as bfield1
from sometable as a

Если я пытаюсь выбрать только связанные записи, он не знает, как связать a.id ввложенный выбор.

select afield1, afield2, bfield1
from   sometable a left join (
    select top 1 id, bfield, aForeignKey 
    from   anothertable
    where  anothertable.aForeignKey = a.id
    order by bfield) b on
       b.aForeignKey = a.id
-- Results in the multi-part identifier "a.id" could not be bound

Если я жестко закодирую значения во вложенном предложении where, длительность выбора уменьшается с 60 секунд до пяти.Кто-нибудь есть какие-либо предложения о том, как объединить две таблицы, не обрабатывая при этом каждую запись во внутренней таблице?

РЕДАКТИРОВАТЬ:

Я закончил тем, что добавил

left outer join (
    select *, row_number() over (partition by / order by) as rank) b on
    b.aforeignkey = a.id and b.rank = 1

из~ 50 секунд до 8 для 22M строк.

Ответы [ 2 ]

2 голосов
/ 18 июля 2011

Попробуйте это:

WITH qry AS
(
    SELECT afield1, 
           afield2, 
           b.field1 AS bfield1,
           ROW_NUMBER() OVER(PARTITION BY a.id ORDER BY field1) rn
      FROM sometable a LEFT JOIN anothertable b
        ON b.aForeignKey = a.id
)
SELECT *
  FROM qry
 WHERE rn = 1
0 голосов
/ 18 июля 2011

Попробуйте это

select afield1, 
afield2, 
bfield1 
from sometable a 
left join 
(select top 1 id, bfield, aForeignKey from  anothertable where  aForeignKey in(a.id)  order by bfield) b on b.aForeignKey = a.id 
...