2010-07-08 59 views
2

不知道如何問這個問題,因爲我是一個數據庫noob,SQL只返回多於一個連接的地方

我想要做的是以下內容。

 
table tb_Company 
table tb_Division 

我想返回有多個部門的公司,我不知道如何執行where子句。

SELECT dbo.tb_Company.CompanyID, dbo.tb_Company.CompanyName, 
dbo.tb_Division.DivisionName FROM dbo.tb_Company INNER JOIN dbo.tb_Division ON 
dbo.tb_Company.CompanyID = dbo.tb_Division.DivisionCompanyID 

任何幫助或鏈接非常感謝。

回答

1

您需要另一個JOIN,您只需使用GROUP BYHAVING條款返回擁有多個部門的公司。

您可以在分組here

組選定的一組行成的 一個值或morecolumns或表達式 組彙總行的閱讀起來。每個組返回一個 行。 SELECT 子句列表中的聚合函數提供有關每個組的 信息,而不是單個行的 。

SELECT dbo.tb_Company.CompanyID 
     , dbo.tb_Company.CompanyName 
     , dbo.tb_Division.DivisionName 
FROM dbo.tb_Company 
     INNER JOIN dbo.tb_Division ON dbo.tb_Company.CompanyID = dbo.tb_Division.DivisionCompanyID 
     INNER JOIN (
      SELECT DivisionCompanyID 
      FROM dbo.tb_Division 
      GROUP BY 
        DivisionCompanyID 
      HAVING COUNT(*) > 1 
     ) d ON d.DivisionCompanyID = dbo.tb_Company.CompanyID 
+0

人照顧解釋downvote?如果發佈的內容不對,應該這樣說,並幫助OP解決他的問題。 – 2010-07-08 09:13:18

0

怎麼樣?

WITH COUNTED AS 
(
    SELECT C.CompanyID, C.CompanyName, D.DivisionName, 
     COUNT() OVER(PARTITION BY C.CompanyID) AS Cnt 
    FROM dbo.tb_Company C 
    INNER JOIN dbo.tb_Division D ON C.CompanyID = D.DivisionCompanyID 
) 
SELECT * 
FROM COUNTED 
WHERE Cnt > 1 

隨着其他的解決方案(即加入到Division表兩次),一個單一的公司/部門可以重插入件負載下被返回。

如果行被插入Division表中的第一連接發生的時間和時間(與group by/having)第二個連接被評估之間,第一Division加入將返回的單個行。然而,第二個將返回2.

+0

tbh我看不到這個特別的查詢(對於公司和部門)曾經受到過重的插入負載... – tt83 2010-07-08 08:58:10

+0

@ tt83:大聲笑,那麼不幸的時機呢? – 2010-07-08 09:20:37

+0

是真的,我沒有想到!:) – tt83 2010-07-08 14:29:12

0

另一種選擇一個個性化......

SELECT c.CompanyId, c.CompanyName, d.DivisionName 
FROM tbl_Company c 
INNER JOIN tbl_Division d ON c.CompanyId=d.DivisionCompanyId 
GROUP BY c.CompanyId, c.CompanyName, d.DivisionName 
HAVING COUNT(*) > 1 
+0

這將返回任何行(當Division表中沒有每個公司的重複記錄時)? – 2010-07-08 08:37:13

+0

@Chris Bednarski:查詢將返回所有擁有多個部門的公司(根據您的文章中的要求)。如果公司有一個部門或更少部門,公司將不會退回。 – tt83 2010-07-08 08:40:49

0

......怎麼

SELECT dbo.tb_Company.CompanyID, 
     dbo.tb_Company.CompanyName, 
    FROM dbo.tb_Company 
    WHERE (SELECT COUNT(*) 
       FROM dbo.tb_Division 
       WHERE dbo.tb_Company.CompanyID = 
          dbo.tb_Division.DivisionCompanyID) > 1;