Исключить записи, соответствующие подзапросу - PullRequest
3 голосов
/ 01 июня 2010

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

Рассмотрим запрос:

SELECT *
FROM reports AS r
JOIN reportvalues AS rv ON rv.report_id = r.report_id
JOIN metrics AS m ON m.metric_id = rv.metric_id
WHERE r.report_id NOT IN(
    SELECT DISTINCT report_id
    FROM exclude_report
)

В этом запросе exclude_report - это представление, построенное аналогичным образом.

Теперь, что происходит, запрос выполняется ОЧЕНЬ долго, предположительно потому, что подзапрос выполняется для каждой строки в родительском запросе. Однако я не нахожу никаких реальных способов сделать это каким-либо иным способом.

О, великие мастера SQL, пожалуйста, посоветуйте. Мне действительно нужен способ сделать все это в SQL, который я буду использовать в SSRS.

Ответы [ 4 ]

4 голосов
/ 01 июня 2010

Вероятно, что отличное убивает вас, вам не нужно различать в подзапросе при использовании в

Это лучше?

SELECT *
FROM reports AS r
JOIN reportvalues AS rv ON rv.report_id = r.report_id
JOIN metrics AS m ON m.metric_id = rv.metric_id
WHERE NOT EXISTS (SELECT 1 
        FROM exclude_report e 
        WHERE e.report_id = r.report_id)
0 голосов
/ 01 июня 2010

Я думаю, что у вас есть следующие индексы:

  • поле report_id на столе report
  • поле report_id на столе reportvalues
  • поле metric_id на столе reportvalues
  • поле metric_id на столе metrics
  • поле report_id на столе exclude_report
0 голосов
/ 01 июня 2010

Вам не нужно отдельное ключевое слово, которое может быть тяжелым. Я бы также посоветовал вам добавить индексы для внешних ключей больших таблиц.

0 голосов
/ 01 июня 2010
SELECT *
FROM reports AS r
JOIN reportvalues AS rv ON rv.report_id = r.report_id
JOIN metrics AS m ON m.metric_id = rv.metric_id
LEFT JOIN exclude_report er ON r.report_id = er.report_id
WHERE er.report_id IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...