在我的网络服务中,我需要能够从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时,它会提取一个空值,所以显然这里有问题。
答案 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等),那么您应该使用外部联接,以确保您仍然可以获取已连接表的数据。