Оператор SQL SELECT для 3 таблиц - PullRequest
       35

Оператор SQL SELECT для 3 таблиц

0 голосов
/ 08 сентября 2011

В моем веб-сервисе мне нужно иметь возможность извлекать из 3 разных таблиц, чтобы мой поиск работал. У меня есть элемент управления автозаполнения на одной странице, который выполняет поиск по описанию, но вместо отображения описания должны отображаться все продукты, в которые введено слово или фраза.

Пример: я ввожу слово "здесь", и autocompleteextender покажет продукты, которые имеют слово "здесь" в своем описании.

Описание продукта находится в одной таблице, которая связана с таблицей продуктов таблицей, содержащей идентификаторы как для продукта, так и для описания. Поэтому мне нужно, чтобы 3 таблицы были связаны между собой. У меня всегда были проблемы с объединением нескольких столов, я надеялся, что кто-нибудь может помочь?

Вот мое утверждение:

"SELECT DISTINCT p.ProductID,
                p.ProductName
FROM   Product p
       INNER JOIN Marketing m
         ON p.ProductID = m.ProductID
       JOIN Feature f
         ON f.FeatureID = m.MarketingData
WHERE  f.FeatureTitle LIKE '%" & prefixText & "%'
ORDER  BY p.ProductName ASC"  

Когда я набираю его в SQL Server, он получает нулевое значение, поэтому, очевидно, что-то здесь не так. Database Structure

Ответы [ 4 ]

4 голосов
/ 08 сентября 2011

Если вы хотите, чтобы в продуктах были только строки с указанным текстом в соответствующем заголовке функции таблицы объектов, вам нужно использовать INNER JOIN, чтобы подавить все ненужные строки.

SELECT DISTINCT 
    p.productid,
    p.productname
FROM product p
INNER JOIN marketing m ON p.productid = m.productid
INNER JOIN feature f ON f.featureid = m.marketingdata
WHERE  f.featuretitle LIKE '%@TextYouSearchFor%'
ORDER  BY p.productname ASC  

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

Добавлено для уточнения:

Если возможно, используйте параметризованный запрос, передавая искомыйтекст в качестве параметра.Это позволит избежать некоторых возможных ошибок с текстами, содержащими зарезервированные символы SQL, такие как 'или

. Всегда указывайте желаемый тип соединения, например, INNER JOIN и т. Д. ...

0 голосов
/ 09 сентября 2011

Я изменил оператор SELECT на это благодаря @MicSim и @Doliveras за предложение другого оператора для проверки на ошибки.

"Select DISTINCT 
p.ProductID, p.ProductName 
FROM Product p 
INNER JOIN Marketing m ON p.ProductID = m.ProductID 
INNER JOIN Feature f ON f.FeatureID =  m.MarketingData 
WHERE m.MarketingTypeID = 3 
AND f.FeatureTitle 
LIKE '%@prefixText%' 
ORDER BY p.ProductName ASC"
0 голосов
/ 08 сентября 2011

Поскольку вам нужны только (отдельные) результаты из таблицы product, вы можете удалить DINSTINCT и использовать GROUP BY p.productid или переписать запрос с помощью EXISTS:

SELECT p.productid,
       p.productname
FROM   product p
WHERE  EXISTS
         ( SELECT *
           FROM   marketing m
             JOIN feature f
               ON f.featureid = m.marketingdata
           WHERE  m.productid = p.productid
             AND  m.MarketingTypeID = 3 
             AND  f.featuretitle LIKE '%" & prefixText & "%'
         )
ORDER  BY
       p.productname ASC  

Производительностьубийца в этом запросе может быть LIKE '%Text%', хотя.Если вы попробуете это с LIKE 'Text%' и будете работать намного быстрее, это причина медлительности.

0 голосов
/ 08 сентября 2011

Если в одной из ваших таблиц нет данных для определенного ключа (ProductID, FeatureID и т. Д.), Вам следует использовать внешнее объединение, чтобы гарантировать, что вы все еще получите данные для объединенной таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...