使用 FULL OUTER JOIN and/or UNION 将具有相似字段的表组合起来
Using FULL OUTER JOIN and/or UNION to combine tables with like fields
我正在尝试创建两个 table 的视图,它们有许多共同的字段。
存在于两个 table 中的字段应该存在于新视图中的一个字段下。我发现了一些帖子 here 和另一个我已经忘记了建议使用 UNION
和 FULL OUTER JOIN
来做我想做的事情,但我对此很陌生并且答案有点混乱。我想我需要 select data
和 elong
中不冲突的所有字段,然后 select 来自组合所有字段的 UNION ALL
语句的其余部分table 有共同点,但是 FULL OUTER JOIN
是如何发挥作用的呢?
我认为需要 FULL OUTER JOIN
才能使视图中的行数与每个 table 的行数总和相同,但我不太确定。
也许 this 是我的解决方案?不过,我不确定 CROSS JOIN
如何处理类似的字段。
对于那些关心我如何加入这些内容的人,我试图从两个 table 中取出每一行并将它们放在一个新视图中。我的问题是由重复字段(c2、footnote1、footnote2 等)引起的。我希望它们保留为 c2、footnote1、footnote2,但它们不断收到生成的别名。凡是 c2 的东西都是 c2,无论它来自哪个 sheet。
编辑:感谢下面的回答,这就是我现在正在写的,这似乎是我想要的。由于字段的数量,它需要永远;有一个更好的方法吗?更自动化的东西?
Edit2:这是完整查询的样子,以防将来对某人有所帮助。我希望有一种更自动的方法来做到这一点,因为那需要一些时间。感谢所有帮助过的人!
SELECT ID, tableNum, UTC, colNum, c1, c2, null AS c3, c4, colRow, footnote1, footnote2, footnote3, footnote4,
property, orientation, specimenDesign, exposTempMinF AS exposTempFMin, exposTempMaxF AS exposTempFMax,
exposTempRTMinF AS exposTempFRTMin, exposTempRTMaxF AS exposTempFRTMax, designValueRoomTempF_A,
designValueRoomTempF_T99 , designValueRoomTempF_B ,
designValueRoomTempF_S , designValueRoomTempF_Typical, designValueRoomTempF_Estimate,
designValueRoomTempF_Units , conversionFactor, null AS form, null AS thickRangeInMin, null AS thickRangeInMax,
null AS widthRangeInMin, null AS widthRangeInMax, null AS areaInSqrMin, null AS areaInSqrMax, note
FROM dbo.[DesignAllowables-Data] AS data
UNION ALL
SELECT ID, tableNum, UTC, colNum, null, c2, c3 , null, colRow, footnote1, footnote2, null , null ,
property, orientation, specimenDesign, exposTempF_min AS exposTempFMin, exposTempF_max AS exposTempFMax,
exposTempRTF_min AS exposTempFRTMin, exposTempRTF_max AS exposTempFRTMax, designValueRTF_A AS designValueRoomTempF_A,
designValueRTF_T99 AS designValueRoomTempF_T99, designValueRTF_B AS designValueRoomTempF_B,
designValueRTF_S AS designValueRoomTempF_S, null , null ,
designValueRTF_Units AS designValueRoomTempF_Units, conversionFactor, form , thickRangeInMin , thickRangeInMax,
widthRangeInMin , widthRangeInMax , areaInSqrMin , areaInSqrMax , note
From dbo.[DesignAllowables-Elong-RA] AS elong
A UNION ALL 基本上returns 两个表,一个接一个。 JOIN 基本上 returns 两个表的列。这是一个过于简单化的问题,但是并集结合了行,而连接结合了列。
如果两个 tables.have 几乎相同的列,听起来您想要一个 UNION。
您链接的问题不适用于您的问题。
以下是一些可以尝试的组合形式:
完全外连接
SELECT
COALESCE(T1.Col1,T2.Col1) As Col1,
COALESCE(T1.Col2,T2.Col2) As Col2
FROM
T1
FULL OUTER JOIN
T2
ON T1.ID = T2.ID
匹配 ID
以合并行。
ID
在两个 table 中必须是唯一的,否则你会得到 'duplicate' 行
联合所有
SELECT
T.ID,
MAX(T.Col1) As Col1,
MAX(T.Col2) As Col2
FROM
(
SELECT Col1,Col2 FROM T1
UNION ALL
SELECT Col1,Col2 FROM T2
) T
GROUP BY T.ID
有效匹配 ID
如果 ID 不唯一,这将不会引入重复项。它将任意选择值的组合
这里是 return 所有组合行和有选择地组合列的方法。在这个例子中,C1只存在于table T1
SELECT C1,C2, C3
FROM T1
UNION ALL
SELECT NULL, C2,C3
FROM T2
重要的问题是:每个 table 上都有唯一的密钥吗?需要匹配吗?
我正在尝试创建两个 table 的视图,它们有许多共同的字段。
存在于两个 table 中的字段应该存在于新视图中的一个字段下。我发现了一些帖子 here 和另一个我已经忘记了建议使用 UNION
和 FULL OUTER JOIN
来做我想做的事情,但我对此很陌生并且答案有点混乱。我想我需要 select data
和 elong
中不冲突的所有字段,然后 select 来自组合所有字段的 UNION ALL
语句的其余部分table 有共同点,但是 FULL OUTER JOIN
是如何发挥作用的呢?
我认为需要 FULL OUTER JOIN
才能使视图中的行数与每个 table 的行数总和相同,但我不太确定。
也许 this 是我的解决方案?不过,我不确定 CROSS JOIN
如何处理类似的字段。
对于那些关心我如何加入这些内容的人,我试图从两个 table 中取出每一行并将它们放在一个新视图中。我的问题是由重复字段(c2、footnote1、footnote2 等)引起的。我希望它们保留为 c2、footnote1、footnote2,但它们不断收到生成的别名。凡是 c2 的东西都是 c2,无论它来自哪个 sheet。
编辑:感谢下面的回答,这就是我现在正在写的,这似乎是我想要的。由于字段的数量,它需要永远;有一个更好的方法吗?更自动化的东西?
Edit2:这是完整查询的样子,以防将来对某人有所帮助。我希望有一种更自动的方法来做到这一点,因为那需要一些时间。感谢所有帮助过的人!
SELECT ID, tableNum, UTC, colNum, c1, c2, null AS c3, c4, colRow, footnote1, footnote2, footnote3, footnote4,
property, orientation, specimenDesign, exposTempMinF AS exposTempFMin, exposTempMaxF AS exposTempFMax,
exposTempRTMinF AS exposTempFRTMin, exposTempRTMaxF AS exposTempFRTMax, designValueRoomTempF_A,
designValueRoomTempF_T99 , designValueRoomTempF_B ,
designValueRoomTempF_S , designValueRoomTempF_Typical, designValueRoomTempF_Estimate,
designValueRoomTempF_Units , conversionFactor, null AS form, null AS thickRangeInMin, null AS thickRangeInMax,
null AS widthRangeInMin, null AS widthRangeInMax, null AS areaInSqrMin, null AS areaInSqrMax, note
FROM dbo.[DesignAllowables-Data] AS data
UNION ALL
SELECT ID, tableNum, UTC, colNum, null, c2, c3 , null, colRow, footnote1, footnote2, null , null ,
property, orientation, specimenDesign, exposTempF_min AS exposTempFMin, exposTempF_max AS exposTempFMax,
exposTempRTF_min AS exposTempFRTMin, exposTempRTF_max AS exposTempFRTMax, designValueRTF_A AS designValueRoomTempF_A,
designValueRTF_T99 AS designValueRoomTempF_T99, designValueRTF_B AS designValueRoomTempF_B,
designValueRTF_S AS designValueRoomTempF_S, null , null ,
designValueRTF_Units AS designValueRoomTempF_Units, conversionFactor, form , thickRangeInMin , thickRangeInMax,
widthRangeInMin , widthRangeInMax , areaInSqrMin , areaInSqrMax , note
From dbo.[DesignAllowables-Elong-RA] AS elong
A UNION ALL 基本上returns 两个表,一个接一个。 JOIN 基本上 returns 两个表的列。这是一个过于简单化的问题,但是并集结合了行,而连接结合了列。
如果两个 tables.have 几乎相同的列,听起来您想要一个 UNION。
您链接的问题不适用于您的问题。
以下是一些可以尝试的组合形式:
完全外连接
SELECT
COALESCE(T1.Col1,T2.Col1) As Col1,
COALESCE(T1.Col2,T2.Col2) As Col2
FROM
T1
FULL OUTER JOIN
T2
ON T1.ID = T2.ID
匹配 ID
以合并行。
ID
在两个 table 中必须是唯一的,否则你会得到 'duplicate' 行
联合所有
SELECT
T.ID,
MAX(T.Col1) As Col1,
MAX(T.Col2) As Col2
FROM
(
SELECT Col1,Col2 FROM T1
UNION ALL
SELECT Col1,Col2 FROM T2
) T
GROUP BY T.ID
有效匹配 ID
如果 ID 不唯一,这将不会引入重复项。它将任意选择值的组合
这里是 return 所有组合行和有选择地组合列的方法。在这个例子中,C1只存在于table T1
SELECT C1,C2, C3
FROM T1
UNION ALL
SELECT NULL, C2,C3
FROM T2
重要的问题是:每个 table 上都有唯一的密钥吗?需要匹配吗?