簡體   English   中英

左外連接內的所有聯合不是獲取所有值,它只是在子查詢之外提取值(哪個 PRJ_elements)

[英]Union all inside the Left outer Join is not fetching all the values, it is just pulling values outside the sub-query (which PRJ_elements)

我有一個關於使用 UNION ALL 和 Left Outer Join 的問題。 我想要實現的是獲取項目總成本以及其他幾個字段,但同時我想要很少的其他字段,例如零件,來自其他表的直接材料與 Union All 連接。 它正在獲取項目成本和左外連接子查詢之外的所有字段,但由於某種原因,它沒有獲取包含在連接內的列。

SELECT COUNT(EVT_C) AS NumWO,
    PRJ_C AS Project, 
    PRJ_DESC AS ProjectDescription, 
    PRJ_S AS Status, 
    PRJ_DES AS MS, 
    PRJ_UDF03 AS SP, 
    SUM(Cost.Total) AS TotalIntLabour,
FROM R5PRJ
LEFT OUTER JOIN R5E ON EVT_PRJ = PRJ_CODE 
LEFT OUTER JOIN (
        SELECT
            BOO_COST AS Total,
            EVT_PRJ AS Project,
            CAST(BOO_SQLI AS NVARCHAR(400)) AS SystemReference,
            BOO_E AS DateEntered,
            'Part' AS RType,
            'Direct Materials' AS Type
        FROM R5BOO
        LEFT OUTER JOIN R5E ON EVT_C = BOO_E 
        WHERE EVT_PRJ IS NOT NULL
    UNION ALL
        SELECT 
            TRL_PRICE*TRL_QTY AS Total,
            EVT_PRJ AS Project,
            TRL_T+'+'+TRL_P AS SystemReference,
            TRL_D AS DateEntered,
            'Part' AS RType,
            'Direct Materials' AS Type
        FROM R5TR
        LEFT OUTER JOIN R5E ON TRL_E = EVT_C
        LEFT OUTER JOIN R5O ON OBJ_C = EVT_OBJ
        WHERE TRL_IO = 0 AND TRL_R IN ('RECV','RETN')
    UNION ALL 
        SELECT 
            TRL_PRICE*TRL_QTY AS Total,
            EVT_PRJ AS Project,
            TRL_T+'+'+TRL_P AS SystemReference,
            TRL_D AS DateEntered,
            'Part' AS RType,
            'Direct Materials' AS Type
        FROM R5TR
        LEFT OUTER JOIN R5E ON TRL_E = EVT_C
        LEFT OUTER JOIN R5O ON OBJ_C = EVT_OBJ
        WHERE TRL_E IS NOT NULL AND TRL_R = 'I' AND TRL_IO = -1
    ) AS Cost ON Cost.Project = PRJ_C
GROUP BY PRJ_C,PRJ_D,PRJ_S,PRJ_D,PRJUDF03,PRJ_ACTBUD,
    PRJ_ORIGBUD,PRJ_UDF01,PRJ_CLASS,PRJ_C

它沒有獲取包含在 Join 中的列。

您沒有在外部查詢中選擇它們。

SQL 對數據塊進行操作。 表是輸入 FROM 的數據塊。 查詢的輸出也是可以輸入 FROM 的數據塊。

Person 表有 3 列; 姓名、生日、身高。

當你寫:

SELECT name 
FROM person

您只得到名稱,即使該表還有另外兩列

當你寫:

SELECT name 
FROM (
  SELECT name, height 
  FROM person
)x

你不會突然得到姓名和身高。 您說您只希望 Name 在最終執行的 SELECT (最上面的)中。 僅僅因為您在內部查詢中提到高度並不意味着它顯示為外部查詢的輸出。 內部查詢的輸出被輸入到外部查詢中,而 out 查詢不選擇 Height 列..就像在使用表名時沒有選擇一樣

SELECT name    --doesn't mention height
FROM person    --even though this has height

這只是“輸入數據塊”(在本例中為 Person 表)和“輸出數據塊”(在本例中為一個輸出反饋給您)

在此查詢中:

SELECT name            --also doesn't mention height
FROM (
  SELECT name, height  --even though this has height
  FROM person
)x

我們有“表人的 3 列輸入數據塊變為 2 列寬輸出”,即返回給您的“2 列輸入數據塊變為 1 列寬輸出”


在外部查詢中,您只能引用由內部/子查詢選擇的列,並使用您為子查詢提供的別名來引用它們。 任何聯合集中的第一個查詢定義整個聯合集的列名

就好像子查詢在查詢期間運行並臨時變成了一個表,因此:

SELECT sq.x
FROM (
  SELECT name as x
  FROM Person

  UNION ALL

  SELECT building_name
  FROM address
) sq

在這里,您可以看到執行並集的子查詢已別名為sq 第一個查詢接受一個人名並將其別名為x 聯合的第二個查詢從地址表中提取了一個建築物名稱,但該名稱對將調用的列沒有影響。 由於聯合集中的第一個查詢,該列被稱為x

因此,您最終會得到一個稱為sq.x的列,其中充滿了人和建築物名稱的混合

在外部查詢中,您不能引用子查詢中任何列或表的任何名稱; 子查詢運行並且它選擇的列成為它被別名的數據塊中的列。 任何未選擇的東西都​​消失了。 如果您需要使用某些東西,您必須選擇它:

SELECT sq.x
FROM (
  SELECT name as x, age as y
  FROM Person

  UNION ALL

  SELECT building_name, YEAR(GetUtcDate()) - building_built_year
  FROM address
) sq
WHERE 
  sq.y > 50

這將獲取所有 50 歲以上的人或建築物:人員查詢別名為y ,外部查詢使用y 計算建築年齡的公式沒有別名; 由於第一個查詢,它進入了y

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM