Сделать запрос OR более упорядоченным - PullRequest
4 голосов
/ 11 января 2011

Я пытаюсь выполнить поиск по customerType, и у меня возникает небольшая проблема:

SELECT DISTINCT CustomerID, CustomerName, City, State, Zip FROM qrySearchFields 
WHERE  CustomerID in (Select CustomerID from tblCustomerTypeLineItems Where CustomerTypeID = 241)

занимает меньше секунды, и так же:

SELECT DISTINCT CustomerID, CustomerName, City, State, Zip FROM qrySearchFields 
WHERE CustomerID in (Select CustomerID from tblCustomerTypeLineItems Where CustomerTypeID = 240)

Но когда я пытаюсь использовать ИЛИ для поиска обоих типов одновременно:

SELECT DISTINCT CustomerID, CustomerName, City, State, Zip FROM qrySearchFields WHERE
CustomerID in (Select CustomerID from tblCustomerTypeLineItems Where CustomerTypeID = 241) 
Or CustomerID in (Select CustomerID from tblCustomerTypeLineItems Where CustomerTypeID = 240)

, это занимает около 40 секунд.

Есть ли лучший способ сделать это или что-то, чего мне не хватает?
Дополнительную информацию смотрите в родительском вопросе: Отображение результатов запроса по горизонтали

Ответы [ 4 ]

1 голос
/ 11 января 2011

2 подзапроса, вероятно, довольно дорогие.Попробуйте эту версию:

SELECT DISTINCT sf.CustomerID, sf.CustomerName, sf.City, sf.State, sf.Zip 
    FROM qrySearchFields sf
        INNER JOIN tblCustomerTypeLineItems ctli
            ON sf.CustomerID = ctli.CustomerID
                AND ctli.CustomerTypeID IN (240,241)
1 голос
/ 11 января 2011

Зачем использовать OR во внешнем запросе?

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

SELECT  DISTINCT CustomerID, CustomerName, City, State, Zip
FROM    qrySearchFields
WHERE   CustomerID IN
        (
        SELECT  CustomerID
        FROM    tblCustomerTypeLineItems
        WHERE   CustomerTypeID IN (240, 241)
        )
1 голос
/ 11 января 2011

Необходимо выполнить гораздо больше работы из-за двух операторов SELECT IN;гораздо эффективнее сделать:

SELECT DISTINCT CustomerID, CustomerName, City, State, Zip 
FROM qrySearchFields
WHERE CustomerID in
      (Select CustomerID from tblCustomerTypeLineItems Where CustomerTypeID IN (240,241))
1 голос
/ 11 января 2011

Почему бы не реструктурировать ваш запрос OR следующим образом:

SELECT DISTINCT CustomerID, CustomerName, City, State, Zip 
  FROM qrySearchFields 
 WHERE CustomerID IN (SELECT CustomerID 
                        FROM tblCustomerTypeLineItems 
                       WHERE CustomerTypeID IN (241, 240))

Если вы используете SQL Server 2005 и выше, вы можете использовать общее табличное выражение (CTE):

WITH cteCustomerId AS 
(
    SELECT CustomerID
      FROM tblCustomerTypeLineItems
     WHERE CustomerTypeID IN (241, 240)
)
SELECT DISTINCT CustomerID, CustomerName, City, State, Zip
  FROM qrySearchFields
 WHERE CustomerID IN (SELECT CustomerID
                        FROM cteCustomerId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...