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
列
我对 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
列