[英]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.