Left outer Join 中的 Union all 并没有获取所有的值,它只是在子查询之外提取值(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 连接。它正在获取 Project costs 和 Left outer join 子查询之外的所有字段,但由于某种原因,它没有获取包含在 Join 中的列。

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

it's not fetching the columns wrapped inside the Join.

你没有在外部查询中 SELECT 它们。

SQL 对数据块进行操作。 table 是输入 FROM 的数据块。查询的输出也是可以输入 FROM 的数据块。

人 table 有 3 列;姓名、生日、身高。

当你写:

SELECT name 
FROM person

即使 table 还有另外两列,您也只会得到名称

当你写:

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

你不会突然得到姓名和身高。你说你只想在最后执行的 SELECT (最上面的那个)中使用 Name 。仅仅因为您在内部查询中提到了 Height 并不意味着它显示为外部查询的输出。内部查询的输出被送入外部查询,并且输出查询不 select 高度列..就像 table 名称用于 [=24] 时一样=]

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

这只是“输入数据块”(在本例中是人 table)和“输出数据块”(在本例中是一个输出反馈给你)

在此查询中:

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

我们有“来自table人的3列输入数据块变成2列宽输出”,变成“2列输入数据块变成1列宽输出”返回给你


在外部查询中,您只能引用由 inner/sub 查询编辑的 select 列,并使用您为子查询提供的别名引用它们。任何联合集中的第一个查询定义整个联合集的列名

就好像子查询是运行,在查询期间暂时变成了table,因此:

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

  UNION ALL

  SELECT building_name
  FROM address
) sq

在这里您可以看到执行联合的子查询别名为 sq。第一个查询采用一个人名并将其别名为 x。联合的第二个查询从地址 table 中提取建筑物名称,但此名称对将调用的列没有影响。由于联合集中的第一个查询

,该列被称为 x

因此您最终得到一个您称为 sq.x 的列,其中充满了人物和建筑物名称的混合

在外部查询中,您不能引用子查询中任何列或 table 的任何名称;子查询是 运行 并且它的列 select 成为它别名的数据块中的列。任何未 selected 的东西都消失了。如果你需要使用某些东西,你必须 select 它:

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