Нужна помощь в настройке оператора SQL - PullRequest
1 голос
/ 31 марта 2010

У меня есть таблица с двумя полями (custno и custno2), которые нужно искать в запросе. Я не создавал этот стол, так что не кричи на меня. :-) Мне нужно найти все записи, где либо custno, либо custno2 совпадают со значением, возвращаемым запросом в той же таблице на основе titleno.

Другими словами, пользователь вводит 1234 для заголовка. Мой запрос ищет в таблице, чтобы найти custno, связанный с titleno. Он также ищет custno2 для этого titleno. Затем он должен выполнить поиск в той же таблице для всех других записей, которые имеют custno или custno2, возвращенные в предыдущем поиске в полях custno или custno2 для этих других записей.

Вот что я придумал:

SELECT BILLYR, BILLNO, TITLENO, VINID, TAXPAID, DUEDATE, DATEPIF, PROPDESC
FROM TRCDBA.BILLSPAID
WHERE CUSTNO IN
 (select custno from trcdba.billspaid where titleno = '1234'
  union select custno2 from trcdba.billspaid where titleno = '1234' and custno2 != '')
OR CUSTNO2 IN
 (select custno from trcdba.billspaid where titleno = '1234'
  union select custno2 from trcdba.billspaid where titleno = '1234' and custno2 != '')

Запрос занимает около 5-10 секунд, чтобы вернуть данные. Можно ли его переписать, чтобы он работал быстрее?

Ответы [ 3 ]

1 голос
/ 31 марта 2010

Простое быстрое повышение могло бы состоять в том, чтобы изменить ваш 'union' на 'union all' (я - sql server - это относится к другим dbs?)

В противном случае могут потребоваться некоторые трюки, специфичные для БД. Какой БД вы используете?

0 голосов
/ 31 марта 2010

Это требует правильной нормализации. Если у вас есть несколько клиентов для одного счета, они должны быть в связанной таблице. Когда у вас есть такие поля, как custno, custno2, у вас, как правило, возникает проблема проектирования, которую необходимо исправить.

0 голосов
/ 31 марта 2010

Кроме того, в предложенном вами решении вы фильтруете таблицу BILLSPAID против titleno = 1234 четыре раза. В зависимости от вашей платформы БД, количества элементов с дубликатами titleno и того, проиндексирован ли titleno, вы можете значительно выиграть, используя временную таблицу. Опять же, в зависимости от вашей платформы, это может выглядеть примерно так:

SELECT * FROM TRCDBA.BILLSPAID INTO MyTempTable 
WHERE titleno = '1234';

SELECT BILLYR, BILLNO, TITLENO, VINID, TAXPAID, DUEDATE, DATEPIF, PROPDESC 
FROM MyTempTable
WHERE CUSTNO IN 
 (select custno from MyTempTable 
  union all select custno2 from MyTempTable where custno2 != '') 
OR CUSTNO2 IN 
 (select custno from MyTempTable 
  union all select custno2 from MyTempTable where custno2 != '') 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...