繁体   English   中英

3个表的SQL SELECT语句

[英]SQL SELECT statement for 3 tables

在我的Web服务中,我需要能够从3个不同的表中提取内容,以使搜索生效。 我在一个按描述搜索的页面上有一个autocompleteextender控件,但是与其显示描述,不如显示描述,它应该显示输入了单词或短语的所有产品。

例如:我输入单词“ here”,自动完成扩展器将显示说明中带有单词“ 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中键入它时,它会拉一个null值,因此显然这里有些问题。 数据库结构

如果只希望产品的行在功能表的匹配功能标题上具有给定的文本,则需要使用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等。

由于只希望从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%'尝试它并且速度更快,这就是速度慢的原因。

由于@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"

如果您的一个表可能没有用于特定键(ProductID,FeatureID等)的任何数据,则应使用外部联接,以确保仍能从联接表中获取数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM