2013-04-21 61 views
0

如果存在1对多关系,我得到一条SQL查询尝试获取1条记录。SQL查询只获得一个存在一对多关系的记录的实例

SELECT  dbo.BlogEntries.ID AS blog_entries_id, dbo.BlogEntries.BlogTitle, dbo.BlogEntries.BlogEntry, dbo.BlogEntries.BlogName, 
         dbo.BlogEntries.DateCreated AS blog_entries_datecreated, dbo.BlogEntries.inActive AS blog_entries_in_active, 
         dbo.BlogEntries.HtmlMetaDescription AS blog_entries_html_meta_description, dbo.BlogEntries.HtmlMetaKeywords AS blog_entries_html_meta_keywords, 
         dbo.BlogEntries.image1, dbo.BlogEntries.image2, dbo.BlogEntries.image3, dbo.BlogEntries.formSelector, dbo.BlogEntries.image1Alignment, 
         dbo.BlogEntries.image2Alignment, dbo.BlogEntries.image3Alignment, dbo.BlogEntries.blogEntryDisplayName, dbo.BlogEntries.published AS blog_entries_published, 
         dbo.BlogEntries.entered_by, dbo.BlogEntries.dateApproved, dbo.BlogEntries.approved_by, dbo.blog_entry_tracking.id AS blog_entry_tracking_id, 
         dbo.blog_entry_tracking.blog, dbo.blog_entry_tracking.blog_entry, dbo.BlogCategories.ID, dbo.BlogCategories.BlogCategoryName, 
         dbo.BlogCategories.BlogCategoryComments, dbo.BlogCategories.DateCreated, dbo.BlogCategories.BlogCategoryTitle, dbo.BlogCategories.BlogCategoryTemplate, 
         dbo.BlogCategories.inActive, dbo.BlogCategories.HtmlMetaDescription, dbo.BlogCategories.HtmlMetaKeywords, dbo.BlogCategories.entry_sort_order, 
         dbo.BlogCategories.per_page, dbo.BlogCategories.shorten_page_content, dbo.BlogCategories.BlogCategoryDisplayName, dbo.BlogCategories.published, 
         dbo.BlogCategories.blogParent 
FROM   dbo.BlogEntries LEFT OUTER JOIN 
         dbo.blog_entry_tracking ON dbo.BlogEntries.ID = dbo.blog_entry_tracking.blog_entry LEFT OUTER JOIN 
         dbo.BlogCategories ON dbo.blog_entry_tracking.blog = dbo.BlogCategories.ID 

我有一些记录分配到2个不同的blogcategories,当我查询它的一切它会返回重复的记录。

如何仅返回1个博客实例?

+0

SELECT DISTINCT .... – 2013-04-21 03:50:44

+0

我删除了我的答案,因为我误读了你的帖子。彼得是对的。 SELECT DISTINCT是你想要的。 – ApplePie 2013-04-21 03:54:43

+1

BlogEntries是否持有博客的个别实例? (表名使得它听起来就像它在博客上保留单独的帖子一样)。只要在你的'select'子句中包含博客类别详细信息(例如博客类别标题),'select distinct'就不会删除重复条目相同的博客在不同的类别下,因为您的查询返回所有正在跟踪的类别。你想仅检索博客第一类的细节(以及如何决定首先选择哪个类别)? – 2013-04-21 09:59:35

回答

1

尝试这一个 -

SELECT blog_entries_id = be.Id 
    , be.BlogTitle 
    , be.BlogEntry 
    , be.BlogName 
    , blog_entries_datecreated = be.DateCreated 
    , blog_entries_in_active = be.inActive 
    , blog_entries_html_meta_description = be.HtmlMetaDescription 
    , blog_entries_html_meta_keywords = be.HtmlMetaKeywords 
    , be.image1 
    , be.image2 
    , be.image3 
    , be.formSelector 
    , be.image1Alignment 
    , be.image2Alignment 
    , be.image3Alignment 
    , be.blogEntryDisplayName 
    , blog_entries_published = be.published 
    , be.entered_by 
    , be.dateApproved 
    , be.approved_by 
    , blog_entry_tracking_id = bet.Id 
    , bet.blog 
    , bet.blog_entry 
    , bc2.Id 
    , bc2.BlogCategoryName 
    , bc2.BlogCategoryComments 
    , bc2.DateCreated 
    , bc2.BlogCategoryTitle 
    , bc2.BlogCategoryTemplate 
    , bc2.inActive 
    , bc2.HtmlMetaDescription 
    , bc2.HtmlMetaKeywords 
    , bc2.entry_sort_order 
    , bc2.per_page 
    , bc2.shorten_page_content 
    , bc2.BlogCategoryDisplayName 
    , bc2.published 
    , bc2.blogParent 
FROM dbo.BlogEntries be 
LEFT JOIN dbo.blog_entry_tracking bet ON be.Id = bet.blog_entry 
OUTER APPLY (
    SELECT TOP 1 * 
    FROM dbo.BlogCategories bc 
    WHERE bet.blog = bc.Id 
) bc2 

此外,我想提一提,在这种情况下,使用在列名别名的降低您的查询的大小,使得它的理解更方便。

0

如果你只需要一个记录后面,你可以使用

SELECT TOP 1 dbo.BlogEntries.ID AS blog_entries_id,dbo.Bl ....(一样的,你现在有)。

它比SELECT DISTINCT更有效

0

这是一个Northwind示例。

对于每个订单,它只会在订单明细表中返回1行。

Use Northwind 
GO 

Select COUNT(*) from dbo.Orders 
select COUNT(*) from dbo.[Order Details] 


select * from dbo.Orders ord 
join 
(select ROW_NUMBER() OVER(PARTITION BY OrderID ORDER BY UnitPrice DESC) AS "MyRowID" , * from dbo.[Order Details] innerOD) derived1 
on ord.OrderID = derived1.OrderID 
Where 
derived1.MyRowID = 1 
Order by ord.OrderID 
相关问题