【问题标题】:T SQL Chain join 4 tablesT SQL链连接4张表
【发布时间】:2013-01-15 06:02:33
【问题描述】:

这是场景: 我有桌子:

  • 文章(articleId、userId、title、datePosted)

  • ArticleTranslations(languageId、articleId、title)(对于本例来说不是那么重要,但我还是要展示)

  • ArticleSections(articleSectionId、articleId、sectionId)

  • 部分(sectionId,内容,...)

  • sectionsAdditionalInfo(sectionId,isApproved)

我正在做的是以某种方式从 userId 的文章中选择一些文章:

SELECT article.articleId, article.userId, ArticleTranslations.title, article.datePosted
FROM Articles
LEFT OUTER JOIN ArticleTranslations ON Article.articleId= ArticlesTranslations.articleId AND ArticlesTranslations.languageId=@languageId
WHERE Articloes.userId=@userId
    ORDER BY
CASE WHEN @sortDirection = 'DD' THEN datePosted END DESC,   -- by date posted
CASE WHEN @sortDirection = 'DA' THEN datePosted END,
CASE WHEN @sortDirection = 'ND' THEN title END DESC,        -- sort by name
CASE WHEN @sortDirection = 'NA' THEN title END, 
CASE WHEN @sortDirection = 'SD' THEN ArticleTranslations.isApproved END DESC, -- is article aproved?
CASE WHEN @sortDirection = 'SA' THEN ArticleTranslations.isApproved END,
CASE WHEN @sortDirection = 'ID' THEN areAllSectionsApproved END DESC,   -- sort by information if sections are all approved - within the article?
CASE WHEN @sortDirection = 'IA' THEN areAllSectionsApproved END

请记住,为了让我的问题更容易理解,我遗漏了一些信息。

现在,我想做的是选择另一个属性(对于上面 SQL 中返回的每篇文章):areAllArticleSectionsApproved

我已经单独组装了 SQL,但我希望为每一行返回这个:

    SELECT CASE WHEN COUNT(sectionsAdditionalInfo.sectionId) > 0 THEN 0 ELSE 1 END AS areAllSectionsApproved
    FROM ArticleSections
    LEFT OUTER JOIN sectionsAdditionalInfo ON ArticleSections.sectionId = sectionsAdditionalInfo.sectionId 
    WHERE articleId=@articleId AND sectionsAdditionalInfo.isApproved=0

我尝试过以某种方式嵌套此 SQL:

    SELECT (outer SQL) .....
    a.*(
    nested SQL - second one I posted here
    ) as a

但它根本不起作用。

我使用的是 SQL Server 2008。

任何有关如何解决此问题的提示将不胜感激;)

【问题讨论】:

    标签: sql tsql join


    【解决方案1】:

    如果不完全了解您的数据和您想要的结果,这样的事情应该可以使用您的上述查询并将您的第二个查询作为子查询加入:

    SELECT article.articleId, 
           article.userId, 
           ArticleTranslations.title, 
           article.datePosted,
           t.areAllSectionsApproved
    FROM Articles
          LEFT OUTER JOIN ArticleTranslations 
              ON Article.articleId= ArticlesTranslations.articleId 
              AND ArticlesTranslations.languageId=@languageId
          LEFT JOIN (
             SELECT 
               articleId, 
               CASE 
                  WHEN COUNT(sectionsAdditionalInfo.sectionId) > 0 
                  THEN 0 
                  ELSE 1 
               END AS areAllSectionsApproved
             FROM ArticleSections
                 LEFT OUTER JOIN sectionsAdditionalInfo 
                    ON ArticleSections.sectionId = sectionsAdditionalInfo.sectionId 
             WHERE sectionsAdditionalInfo.isApproved=0
             GROUP BY articleId
        ) t ON articles.articleId = t.articleId
    WHERE Articloes.userId=@userId
    ORDER BY
       CASE WHEN @sortDirection = 'DD' THEN datePosted END DESC,   -- by date posted
       CASE WHEN @sortDirection = 'DA' THEN datePosted END,
       CASE WHEN @sortDirection = 'ND' THEN title END DESC,        -- sort by name
       CASE WHEN @sortDirection = 'NA' THEN title END, 
       CASE WHEN @sortDirection = 'SD' THEN ArticleTranslations.isApproved END DESC, -- is article aproved?
       CASE WHEN @sortDirection = 'SA' THEN ArticleTranslations.isApproved END,
       CASE WHEN @sortDirection = 'ID' THEN areAllSectionsApproved END DESC,   -- sort by information if sections are all approved - within the article?
       CASE WHEN @sortDirection = 'IA' THEN areAllSectionsApproved END
    

    祝你好运。

    【讨论】:

    • 嘿...感谢您的回复,这正是我所需要的。数据可能有点难以理解,因为我对它进行了一点伪装(这与文章和章节无关:D)我唯一不明白的是为什么你的解决方案在应该的时候给了我 0(对于 t.areAllSectionsApproved)当它应该给我 1 时给我 NULL ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2015-02-26
    相关资源
    最近更新 更多