2015-12-24 116 views
0

我的問題是我們可以在不使用子查詢,CTE或臨時表的情況下將表A連接到表A和B的內部連接的結果表?在不使用子查詢,CTE或臨時表的情況下加入另一個連接的結果表

我正在使用SQL Server。

我會說明情況,用一個例子

的是兩個表GoaLScorersGoalScoredDetails

射手

gid Name  
----------- 
1  A 
2  B 
3  A 

GoalScoredDetails

DetailId gid  stadium  goals Cards 
--------------------------------------------- 
1   1  X   2  1 
2   2  Y   5  2 
3   3  Y   2  1 

我期待的結果是,如果我選擇一個球場 'X'(或 'Y')

我應該得到所有的名字誰可能或可能沒有進球,也是總進球總數,總牌數。

如果沒有目標或沒有卡片,名稱可以使用空值。

我可以得到我與下面的查詢期望的結果

SELECT 
    gs.name, 
    SUM(goal) as TotalGoals, 
    SUM(cards) as TotalCards 
FROM 
    (SELECT 
     gid, stadium, goal, cards 
    FROM 
     GoalScoredDetails 
    WHERE 
     stadium = 'Y') AS vtable 
RIGHT OUTER JOIN 
    GoalScorers AS gs ON vtable.gid = gs.gid 
GROUP BY 
    gs.name 

我的問題,我們是可以得到不使用子查詢或CTE或臨時表上面的結果呢?

基本上我們需要做的是OUTER JOIN GoalScorers到結果虛擬表INNER JOIN OF GoalScorersGoalScoredDetails

但是我總是面臨模糊的列名錯誤,因爲「gid」列出現在GoalScorers以及結果表中。即使我嘗試爲列名使用別名,錯誤仍然存​​在。

我創建了一個SQL搗鼓這個她:http://sqlfiddle.com/#!3/40162/8

+0

如果在引用列時始終使用表名或別名,則可避免該錯誤。示例:SELECT gid不包含SQL所需的全部信息,而SELECT gs.gid則包含此信息。 –

+0

@ destination-data主要的問題是我如何在結果表中別名或指定gid列。即使我在select中指定了別名,它也不能用於加入,除非它是子查詢 – Raj

回答

3
SELECT gs.name, SUM(gsd.goal) AS totalGoals, SUM(gsd.cards) AS totalCards 
FROM GoalScorers gs 
LEFT JOIN GoalScoredDetails gsd ON gsd.gid = gs.gid AND 
            gsd.Stadium = 'Y' 
GROUP BY gs.name; 

督察,你可以把你的地方標準,在加入表達。

+0

謝謝。我知道他們是完成這件事的一種方式,但無法弄清楚。萬分感謝。 – Raj

0

錯誤不明確的列名時,SQL Server遇到有相同的兩個或多個列,也沒有被告知要使用哪個發生「的ColumnName」。您可以通過在列名前添加完整的表名稱或別名(如果提供)來避免該錯誤。用於下面實施例中使用下面的數據:

示例數據

DECLARE @GoalScorers TABLE 
    (
     gid  INT, 
     Name VARCHAR(1) 
    ) 
; 

DECLARE @GoalScoredDetails TABLE 
    (
     DetailId INT, 
     gid   INT, 
     stadium  VARCHAR(1), 
     goals  INT,  
     Cards  INT 
    ) 
; 

INSERT INTO @GoalScorers 
    (
     gid, 
     Name 
    ) 
VALUES 
    (1, 'A'), 
    (2, 'B'), 
    (3, 'A') 
; 

INSERT INTO @GoalScoredDetails 
    (
     DetailId, 
     gid, 
     stadium, 
     goals, 
     Cards 
    ) 
VALUES 
    (1, 1, 'x', 2, 1), 
    (2, 2, 'y', 5, 2), 
    (3, 3, 'y', 2, 1) 
; 

在我們收到錯誤此第一個例子。爲什麼?由於有多個名爲gid的列,它不能分辨使用哪個列。

失敗的例子

SELECT 
    gid   
FROM 
    @GoalScoredDetails AS gsd 
     RIGHT OUTER JOIN @GoalScorers as gs  ON gs.gid = gsd.gid 
; 

這個例子的作品,因爲我們明確地告訴SQL它GID返回:

工作實例

SELECT 
    gs.gid   
FROM 
    @GoalScoredDetails AS gsd 
     RIGHT OUTER JOIN @GoalScorers as gs  ON gs.gid = gsd.gid 
; 

你可以,當然,同時返回:

示例

SELECT 
    gs.gid,  
    gsd.gid 
FROM 
    @GoalScoredDetails AS gsd 
     RIGHT OUTER JOIN @GoalScorers as gs  ON gs.gid = gsd.gid 
; 

在多表查詢中,我總是建議在每個列名前添加一個表/別名。這使得查詢更容易遵循,並減少了這種錯誤的可能性。

相關問題