Есть ли способ переписать SQL-запрос эффективно - PullRequest
2 голосов
/ 23 апреля 2010

У меня есть две таблицы со следующим определением

    TableA                                          TableB
ID1   ID2   ID3  Value1 Value                      ID1 Value1
 C1    P1   S1                                     S1
 C1    P1   S2                                     S2
 C1    P1   S3                                     S3
 C1    P1   S5                                     S4
                                                   S5

Значения являются лишь примерами в таблице. TableA имеет кластерный первичный ключ ID1, ID2 и ID3, а TableB имеет p.k. ID1 Мне нужно создать таблицу с отсутствующими записями в TableA на основе TableB Запрос на выборку, который я пытаюсь создать, должен выдать следующий результат

C1  P1  S4

Для этого у меня есть следующий запрос SQL

    SELECT
    DISTINCT TableA.ID1, TableA.ID2, TableB.ID1
    FROM TableA a, TableB b 
    WHERE TableB.ID1 NOT IN 
    ( 
      SELECT DISTINCT [ID3] 
      FROM TableA aa
      WHERE a.ID1 == aa.ID1 
        AND a.ID2 == aa.ID2 
    )

Хотя этот запрос работает, он работает плохо, и моя последняя таблица A может содержать до 1 млн записей. Есть ли способ переписать это более эффективно.

Спасибо за любую помощь, Джавид

Ответы [ 3 ]

1 голос
/ 23 апреля 2010

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

SELECT T1.ID1, T1.ID2, T2.ID1 FROM (
    SELECT ID1, ID2
    FROM TableA
    GROUP BY ID1, ID2
) T1
CROSS JOIN TableB T2
LEFT JOIN TableA T3
ON T1.ID1 = T3.ID1 AND T1.ID2 = T3.ID2 AND T2.ID1 = T3.ID3
WHERE T3.ID1 IS NULL
0 голосов
/ 23 апреля 2010

Спасибо всем за то, что поделились своими мыслями. Я удалил ключевое слово DISTINCT из запроса выбора INNER и смог добиться некоторой производительности. Кроме того, я изменил запрос больше и увеличил производительность. Я думал поделится своим решением со всеми

Select c.*
FROM TAbleA a
RIGHT JOIN
( SELECT DISTINCT ID1, ID2, b.ID1 
  FROM TableA, 
  ( SELECT ID1 FROM TableB ) b 
) c
ON a.[ID1] = c.[ID1] AND a.[ID2] = c.[ID2] AND a.[ID3] = c.[ID3]
WHERE a.[ID3] IS NULL
0 голосов
/ 23 апреля 2010

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

select TableC.ID1 as C, TableP.ID1 as P, TableB.ID1 as B
from TableC 
    cross join TableP
    cross join TableB

(Это большое предположение, что этисравнительно небольшие таблицы)

Тогда вы можете присоединиться к этому запросу, например,

select ID1, ID2, ID3
from TableA A
    left outer join 
        (select TableC.ID1 as C, TableP.ID1 as P, TableB.ID1 as B
         from TableC 
             cross join TableP
             cross join TableB) X on A.ID1 = X.C and A.ID2 = X.P and A.ID3 = X.B
where X.ID3 is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...