3个表的SQL SELECT语句

时间:2011-09-08 14:19:07

标签: sql sql-server database sql-server-2008 select

在我的网络服务中,我需要能够从3个不同的表中提取以使我的搜索工作。我在一个页面上有一个autocompleteextender控件,它按描述进行搜索,但它不会显示描述,而是显示所有输入了单词或短语的产品。

例如:我输入“here”这个词,autocompleteextender将显示其描述中包含“here”字样的产品。

产品的描述位于一个表中,该表通过包含产品和描述的ID的表链接到产品表。因此,我需要链接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 个答案:

答案 0 :(得分:4)

如果只想要在特征表的匹配特征标题上具有给定文本的产品上的行,则需要使用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等......

答案 1 :(得分:0)

由于您只需要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%'尝试它并且速度更快,那就是缓慢的原因。

答案 2 :(得分:0)

由于@MicSim和@Doliveras建议使用不同的语句来测试错误,我将SELECT语句更改为此。

"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"

答案 3 :(得分:-1)

如果您的某个表可能没有特定键的任何数据(ProductID,FeatureID等),那么您应该使用外部联接,以确保您仍然可以获取已连接表的数据。