Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
| Author |
Topic |
|
toddhd
Yak Posting Veteran
55 Posts |
Posted - 2005-05-25 : 15:04:56
|
| I have a bunch of tables related to a document management system. The main table is called KBArticles, and it includes the KBArticleID (uniqueid), ArticleID, Title and Content of the articles. All the other tables are related to properties of each article (not really important to this matter). The KBArticles table is Full Text Indexed using SQL 2000. I wrote a SELECT query to pull the records sorted by rank. It looks like this, and works fine:SELECT DISTINCT TOP 100 PERCENT KEY_TBL.RANK, a.ArticleID, a.KBArticleID, a.TitleFROM KBArticles AS a INNER JOIN FREETEXTTABLE(KBArticles, *, 'hr') AS KEY_TBL ON a.KBArticleID = KEY_TBL.[KEY]LEFT OUTER JOIN KBArticleProducts ON a.ArticleID = KBArticleProducts.ArticleIDLEFT OUTER JOIN KBProducts ON KBArticleProducts.ProductID = KBProducts.ProductIDLEFT OUTER JOIN KBArticleVersions ON a.ArticleID = KBArticleVersions.ArticleIDLEFT OUTER JOIN KBProductVersions ON KBArticleVersions.VersionID = KBProductVersions.VersionIDLEFT OUTER JOIN KBArticleCategories ON a.ArticleID = KBArticleCategories.ArticleIDLEFT OUTER JOIN KBProductCategories ON KBArticleCategories.CategoryID = KBProductCategories.CategoryIDLEFT OUTER JOIN KBArticleSubCategories ON a.ArticleID = KBArticleSubCategories.ArticleIDLEFT OUTER JOIN KBProductSubCategories ON KBArticleSubCategories.SubCategoryID = KBProductSubCategories.SubCategoryIDLEFT OUTER JOIN KBArticleTypes ON a.ArticleID = KBArticleTypes.ArticleIDLEFT OUTER JOIN KBTypes ON KBArticleTypes.TypeID = KBTypes.TypeIDLEFT OUTER JOIN KBArticleLocales ON a.ArticleID = KBArticleLocales.ArticleIDLEFT OUTER JOIN KBLocales ON KBArticleLocales.LocaleID = KBLocales.LocaleIDLEFT OUTER JOIN KBArticleRoles ON a.ArticleID = KBArticleRoles.ArticleIDLEFT OUTER JOIN Roles ON KBArticleRoles.RoleID = Roles.RoleIDWHERE a.Enabled = 1ORDER BY KEY_TBL.RANK DESCHERE IS THE PROBLEM. I need to extract the KBArticles.Content field as well. But since DISTINCT won't work with Text fields, I can't do that directly. So I decided to just wrap the above as a subquery, and then pull the relevent records, like this:SELECT Content FROM KBArticles WHERE KBArticleID IN(SELECT DISTINCT TOP 100 PERCENT KEY_TBL.RANK, a.ArticleID, a.KBArticleID, a.TitleFROM KBArticles AS a INNER JOIN FREETEXTTABLE(KBArticles, *, 'hr') AS KEY_TBL ON a.KBArticleID = KEY_TBL.[KEY]LEFT OUTER JOIN KBArticleProducts ON a.ArticleID = KBArticleProducts.ArticleIDLEFT OUTER JOIN KBProducts ON KBArticleProducts.ProductID = KBProducts.ProductIDLEFT OUTER JOIN KBArticleVersions ON a.ArticleID = KBArticleVersions.ArticleIDLEFT OUTER JOIN KBProductVersions ON KBArticleVersions.VersionID = KBProductVersions.VersionIDLEFT OUTER JOIN KBArticleCategories ON a.ArticleID = KBArticleCategories.ArticleIDLEFT OUTER JOIN KBProductCategories ON KBArticleCategories.CategoryID = KBProductCategories.CategoryIDLEFT OUTER JOIN KBArticleSubCategories ON a.ArticleID = KBArticleSubCategories.ArticleIDLEFT OUTER JOIN KBProductSubCategories ON KBArticleSubCategories.SubCategoryID = KBProductSubCategories.SubCategoryIDLEFT OUTER JOIN KBArticleTypes ON a.ArticleID = KBArticleTypes.ArticleIDLEFT OUTER JOIN KBTypes ON KBArticleTypes.TypeID = KBTypes.TypeIDLEFT OUTER JOIN KBArticleLocales ON a.ArticleID = KBArticleLocales.ArticleIDLEFT OUTER JOIN KBLocales ON KBArticleLocales.LocaleID = KBLocales.LocaleIDLEFT OUTER JOIN KBArticleRoles ON a.ArticleID = KBArticleRoles.ArticleIDLEFT OUTER JOIN Roles ON KBArticleRoles.RoleID = Roles.RoleIDWHERE a.Enabled = 1ORDER BY KEY_TBL.RANK DESC)Makes sense, right? But I get this error message:Server: Msg 116, Level 16, State 1, Line 1Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.Why am I getting this message? I tried replacing the IN statement with EXISTS, but that just gives me dozens of records (it should have given me three). Am I using IN wrongly? Any suggstions? |
|
|
SreenivasBora
Posting Yak Master
164 Posts |
Posted - 2005-05-25 : 15:18:49
|
| Yes You cant refer Multiple columns for IN Clause. So you have to use EXISTS Clause.Here is the Mistake:===================SELECT Content FROM KBArticles WHERE KBArticleID IN(SELECT DISTINCT TOP 100 PERCENT KEY_TBL.RANK, a.ArticleID, a.KBArticleID, a.TitleFROM KBArticles AS a You can write like this:========================SELECT Content FROM KBArticles WHERE KBArticleID IN (SELECT DISTINCT TOP 100 PERCENT a.ArticleID FROM KBArticles AS a If you need more columns then:==============================SELECT Content FROM KBArticles WHERE KBArticleID EXISTS (SELECT DISTINCT TOP 100 PERCENT KEY_TBL.RANK, a.ArticleID, a.KBArticleID, a.TitleFROM KBArticles AS aWith RegardsSreenivas Reddy B |
 |
|
|
|
|
|
|
|