我有以下查询 -
SELECT CP.PostID,CP.SectionID
FROM NewsLetter NW
inner Join MapNewsletterPosts as MM on NW.ID = MM.ID
inner join CSPosts as CP with (nolock) on MM.PostID = CP.PostID
inner join PostStatus PS on PS.Postid=CP.PostId
WHERE
NW.NewsletterDate = '2015-07-06'
and CP.IsApproved =1
ANd PS.StatusId =7
AND CP.SectionID NOT IN (92,227)
AND NW.SectionID = 95
ORDER BY MM.Newslettersortorder
以上查询返回正确的结果,如下所示 -
现在,当我再添加一个连接到上面的查询 -
SELECT CP.PostID,CP.SectionID
FROM NewsLetter NW
inner Join MapNewsletterPosts as MM on NW.ID = MM.ID
inner join CSPosts as CP with (nolock) on MM.PostID = CP.PostID
inner join PostStatus PS on PS.Postid=CP.PostId
INNER JOIN NewsletterDetails ND ON ND.NewsletterDate = NW.NewsletterDate AND ND.IncludeInArticles=1 <<--added extra JOIN
WHERE
NW.NewsletterDate = '2015-07-06'
and CP.IsApproved =1
ANd PS.StatusId =7
AND CP.SectionID NOT IN (92,227)
AND NW.SectionID = 95
ORDER BY MM.Newslettersortorder
导致冗余数据如下所示 -
答案 0 :(得分:4)
您可以将额外加入替换为EXISTS()
:
SELECT CP.PostID,CP.SectionID
FROM NewsLetter NW
inner Join MapNewsletterPosts as MM on NW.ID = MM.ID
inner join CSPosts as CP with (nolock) on MM.PostID = CP.PostID
inner join PostStatus PS on PS.Postid=CP.PostId
WHERE EXISTS(SELECT 1 FROM NewsletterDetails nd
WHERE ND.NewsletterDate = NW.NewsletterDate AND ND.IncludeInArticles=1)
AND NW.NewsletterDate = '2015-07-06'
and CP.IsApproved =1
ANd PS.StatusId =7
AND CP.SectionID NOT IN (92,227)
AND NW.SectionID = 95
ORDER BY MM.Newslettersortorder
这种情况发生的原因是,在额外的表格中有超过1行且NewsletterDate
相同,存在将消除此问题,您也不再需要使用DISTINCT
或GROUP BY
。< / p>
编辑:如果您只想要那些记录IncludeInArticles=0
的记录不存在的记录,请使用:
SELECT CP.PostID,CP.SectionID
FROM NewsLetter NW
inner Join MapNewsletterPosts as MM on NW.ID = MM.ID
inner join CSPosts as CP with (nolock) on MM.PostID = CP.PostID
inner join PostStatus PS on PS.Postid=CP.PostId
WHERE NOT EXISTS(SELECT 1 FROM NewsletterDetails nd
WHERE ND.NewsletterDate = NW.NewsletterDate AND ND.IncludeInArticles=0)
AND NW.NewsletterDate = '2015-07-06'
and CP.IsApproved =1
ANd PS.StatusId =7
AND CP.SectionID NOT IN (92,227)
AND NW.SectionID = 95
ORDER BY MM.Newslettersortorder
编辑:很难理解你想要什么!我猜你想要IncludeInArticles = 1
并且没有IncludeInArticles=0
的记录?现在它是唯一剩下的选择:
SELECT CP.PostID,CP.SectionID
FROM NewsLetter NW
inner Join MapNewsletterPosts as MM on NW.ID = MM.ID
inner join CSPosts as CP with (nolock) on MM.PostID = CP.PostID
inner join PostStatus PS on PS.Postid=CP.PostId
WHERE EXISTS(SELECT 1 FROM NewsletterDetails nd
WHERE ND.NewsletterDate = NW.NewsletterDate AND ND.IncludeInArticles=1)
AND NOT EXISTS(SELECT 1 FROM NewsletterDetails nd
WHERE ND.NewsletterDate = NW.NewsletterDate AND ND.IncludeInArticles=0)
AND NW.NewsletterDate = '2015-07-06'
and CP.IsApproved =1
ANd PS.StatusId =7
AND CP.SectionID NOT IN (92,227)
AND NW.SectionID = 95
ORDER BY MM.Newslettersortorder
答案 1 :(得分:1)
您的最终内部联接每个PostID会有多行数据。
回到第一组结果的最简单方法是将distinct修饰符添加到select:
SELECT DISTINCT CP.PostID,CP.SectionID
答案 2 :(得分:1)
您可以将ON
条件替换为ND.PostId =CP.PostID
试试这个 -
SELECT CP.PostID,CP.SectionID
FROM NewsLetter NW
inner Join MapNewsletterPosts as MM on NW.ID = MM.ID
inner join CSPosts as CP with (nolock) on MM.PostID = CP.PostID
inner join PostStatus PS on PS.Postid=CP.PostId
INNER JOIN NewsletterDetails ND ON ND.PostId =CP.PostID AND ND.IncludeInArticles=1
WHERE
NW.NewsletterDate = '2015-07-06'
and CP.IsApproved =1
ANd PS.StatusId =7
AND CP.SectionID NOT IN (92,227)
AND NW.SectionID = 95
ORDER BY MM.Newslettersortorder
答案 3 :(得分:0)
发生这种情况的原因是你在NewsLetterDetails中有多行数据。尝试将此表中的一个字段拉入查询中以查看我的意思。
SELECT
CP.PostID
,CP.SectionID
,ND.*
FROM NewsLetter NW
INNER JOIN MapNewsletterPosts as MM
ON NW.ID = MM.ID
INNER JOIN CSPosts as CP with (nolock)
ON MM.PostID = CP.PostID
INNER JOIN PostStatus PS
ON PS.Postid=CP.PostId
INNER JOIN NewsletterDetails ND
ON ND.NewsletterDate = NW.NewsletterDate
AND ND.IncludeInArticles=1
WHERE NW.NewsletterDate = '2015-07-06'
AND CP.IsApproved =1
AND PS.StatusId =7
AND CP.SectionID NOT IN (92,227)
AND NW.SectionID = 95
ORDER BY MM.Newslettersortorder
如果您只是想要一个像之前一样的独特列表,那么这就是
SELECT DISTINCT
CP.PostID
,CP.SectionID
FROM NewsLetter NW
INNER JOIN MapNewsletterPosts as MM
ON NW.ID = MM.ID
INNER JOIN CSPosts as CP with (nolock)
ON MM.PostID = CP.PostID
INNER JOIN PostStatus PS
ON PS.Postid=CP.PostId
INNER JOIN NewsletterDetails ND
ON ND.NewsletterDate = NW.NewsletterDate
AND ND.IncludeInArticles=1
WHERE NW.NewsletterDate = '2015-07-06'
AND CP.IsApproved =1
AND PS.StatusId =7
AND CP.SectionID NOT IN (92,227)
AND NW.SectionID = 95
ORDER BY MM.Newslettersortorder