2010-04-01 2 views
3

Я пытаюсь выбрать записи с заявлениемустановить различие в SQL запросе

SELECT * 
FROM A 
WHERE 
    LEFT(B, 5) IN 
    (SELECT * FROM 
     (SELECT LEFT(A.B,5), COUNT(DISTINCT A.C) c_count 
     FROM A 
     GROUP BY LEFT(B,5) 
     ) p1 
     WHERE p1.c_count = 1 
    ) 
    AND C IN 
     (SELECT * FROM 
      (SELECT A.C , COUNT(DISTINCT LEFT(A.B,5)) b_count 
      FROM A 
      GROUP BY C 
      ) p2 
      WHERE p2.b_count = 1) 

, который занимает много времени для запуска ~ 15 сек.

Есть ли лучший способ написать этот SQL?

+2

Вам действительно нужно предоставить пример ввода и вывода данных со схемой ... и принять больше ответов – gbn

+1

gbn: ahaha. Ну, иногда есть более одного действительного ответа, и я не могу решить, какой ответ принять. – TheObserver

+1

есть много вопросов для нас, чтобы ответить, мы можем решить ответить тем, где мы получим репутацию и отметьте галочки – gbn

ответ

0

Вам не нужно возвращать данные из вложенных подзапросов. Я не уверен, что это изменит индексирование, но его легче читать.

И СУЩЕСТВУЕТ/JOIN, вероятно, лучше, ИМХО, то с помощью IN

SELECT * 
FROM 
    A 
    JOIN 
    (SELECT LEFT(B,5) AS b1 
     FROM A 
     GROUP BY LEFT(B,5) 
     HAVING COUNT(DISTINCT C) = 1 
    ) t1 On LEFT(A.B, 5) = t1.b1 
    JOIN 
    (SELECT C AS C1 
     FROM A 
     GROUP BY C 
     HAVING COUNT(DISTINCT LEFT(B,5)) = 1 
    ) t2 ON A.C = t2.c1 

Но вам нужно вычисляемый столбец как marc_s, по меньшей мере

и 2 индекса: один на (computed, C) и еще на (C, computed)

0

Ну, не уверен, что вы действительно пытаетесь сделать здесь, но, очевидно, что выражение LEFT(B, 5) продолжает выскакивать. Поскольку вы используете функцию, вы отказываетесь от возможности использовать индекс.

Что вы можете сделать в таблице SQL Server, чтобы создать вычислено, сохранялся столбец для этого выражения, а затем положить индекс, что:

ALTER TABLE A 
    ADD LeftB5 AS LEFT(B, 5) PERSISTED 

CREATE NONCLUSTERED INDEX IX_LeftB5 ON dbo.A(LeftB5) 

Теперь использовать новый вычисляемый столбец LeftB5 вместо LEFT(B, 5) в любом месте вашего запроса - это должно помочь ускорить определенные поисковые запросы и выполнить операции GROUP BY.

Кроме того - у вас есть GROUP BY C, там есть колонка C с индексом?

1

Если вы хотите представить функцию Set Difference (AB) в SQL, вот решение для вас. Предположим, у вас есть две таблицы A и B, и вы хотите получить все записи, которые существуют только в A, но не в B, где A и B имеют отношения через атрибут с именем ID. Эффективный запрос для этого: блог

# (A-B) 
SELECT DISTINCT A.* FROM (A LEFT OUTER JOIN B on A.ID=B.ID) WHERE B.ID IS NULL 

-из Jayaram Timsina в.

Смежные вопросы