Sql server 一个表中的多个列引用回一个表以获取其值
我有一个表Sql server 一个表中的多个列引用回一个表以获取其值,sql-server,sql-server-2008,tsql,sql-server-2008-r2,Sql Server,Sql Server 2008,Tsql,Sql Server 2008 R2,我有一个表table\u One,它有多个列(第1列、第2列、第3列、第4列……)两个引用(包含table\u two)到另一个表table\u two。有没有什么有效的方法可以连接这两个表,而不是将一个表连接回两个表。br/> 这两个表和所需结果集的结构如下所示。 表1 Select Table_One.PrimaryKey, T2_Column1.ColumnA As Column1, T2_Column2.ColumnA As Column2 From Ta
table\u One
,它有多个列(第1列、第2列、第3列、第4列……)
两个引用(包含table\u two
)到另一个表table\u two
。有没有什么有效的方法可以连接这两个表,而不是将一个表连接回两个表。br/>
这两个表和所需结果集的结构如下所示。
表1
Select Table_One.PrimaryKey,
T2_Column1.ColumnA As Column1,
T2_Column2.ColumnA As Column2
From Table_One
Inner Join Table_Two As T2_Column1
On Table_One.Column1 = T2_Column1.ID
Inner Join Table_Two As T2_Column2
On Table_One.Column2 = T2_Column2.Id
基本上,您两次加入表2。执行此操作时,必须至少为其中一个别名,以便SQL不会混淆。作为实践,通常最好同时使用这两个别名,以便在6个月后再次阅读此代码时更容易理解
基本上,您两次加入表2。执行此操作时,必须至少为其中一个别名,以便SQL不会混淆。作为实践,通常最好将这两个表都加上别名,以便在6个月后再次阅读此代码时更容易理解。您是否尝试过为table2表加上别名并将其两次连接到下面的table\u One
SELECT
t1.PrimaryKey,
c1.ColumnA AS Column1,
c2.ColumnA AS Column2
FROM Table_One t1
JOIN Table_two c1 ON t1.Column1 = c1.ID
JOIN Table_two c2 ON t1.Column2 = c2.ID;
您是否尝试过为table2表添加别名并将其两次连接到下面的table_One
SELECT
t1.PrimaryKey,
c1.ColumnA AS Column1,
c2.ColumnA AS Column2
FROM Table_One t1
JOIN Table_two c1 ON t1.Column1 = c1.ID
JOIN Table_two c2 ON t1.Column2 = c2.ID;
以下解决方案()只读取第二个表中的行一次:
SET STATISTICS IO ON;
...
PRINT 'Test #1'
SELECT *
FROM
(
SELECT ca.PrimaryKey, ca.[Type], y.ColumnA
FROM @Table1 x
UNPIVOT( Value FOR [Type] IN ([Column1], [Column2]) ) ca
INNER MERGE /*HASH*/ JOIN @Table2 y ON ca.Value = y.ID
) src
PIVOT( MAX(src.ColumnA) FOR src.[Type] IN ([Column1], [Column2]) ) pvt
PRINT 'End of Test #1'
结果:
Test #1
PrimaryKey Column1 Column2
---------- --------- -------
1 ALPHA CHARLIE
2 BETA DELTA
3 CHARLIE ALPHA
4 DELTA CHARLIE
5 ALPHA DELTA
6 CHARLIE ALPHA
7 ALPHA DELTA
8 DELTA CHARLIE
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#65B6F546'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#61E66462'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
End of Test #1
以下解决方案()只读取第二个表中的行一次:
SET STATISTICS IO ON;
...
PRINT 'Test #1'
SELECT *
FROM
(
SELECT ca.PrimaryKey, ca.[Type], y.ColumnA
FROM @Table1 x
UNPIVOT( Value FOR [Type] IN ([Column1], [Column2]) ) ca
INNER MERGE /*HASH*/ JOIN @Table2 y ON ca.Value = y.ID
) src
PIVOT( MAX(src.ColumnA) FOR src.[Type] IN ([Column1], [Column2]) ) pvt
PRINT 'End of Test #1'
结果:
Test #1
PrimaryKey Column1 Column2
---------- --------- -------
1 ALPHA CHARLIE
2 BETA DELTA
3 CHARLIE ALPHA
4 DELTA CHARLIE
5 ALPHA DELTA
6 CHARLIE ALPHA
7 ALPHA DELTA
8 DELTA CHARLIE
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#65B6F546'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#61E66462'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
End of Test #1
非常感谢您的快速回复,我将在明天的工作中尝试,表1是一个非常大的表,有大约2000万条记录,我最终创建了一个UDF,表2的PK作为返回ColumnA值的参数。你认为这应该做的很好,因为我已经加入了13-15个不同的表格,以获得所需的结果集。这个问题只是我整个问题的一部分。有什么建议吗?很难说。我强烈怀疑这种方法的性能会更好,但根据您创建的UDF,这种方法的性能可能也会更好。如果非要我猜的话,我会说这种方法的性能即使不是更好也至少会一样好(可能会更好)。还考虑到性能很大程度上取决于您的表上的索引。我怀疑如果这个表中有近170列,索引中是否有索引,那么我还没有真正使用这个列,但我会用您的解决方案和我已经做的方式来检查执行计划。让我们看看哪一个最适合我。无论如何,非常感谢您的帮助,干杯,朋友:)表1上的索引不需要太复杂,所以值得您尝试一下。当然,我不会在生产环境中这样做,但如果你能在开发环境中这样做,那就太好了。是的,我明天会在开发服务器上试一试。祈祷:)非常感谢您的快速回复,我明天会在工作中尝试,表1是一个非常大的表,有大约2000万条记录,我最终创建了一个UDF,表2的PK作为返回ColumnA值的参数。你认为这应该做的很好,因为我已经加入了13-15个不同的表格,以获得所需的结果集。这个问题只是我整个问题的一部分。有什么建议吗?很难说。我强烈怀疑这种方法的性能会更好,但根据您创建的UDF,这种方法的性能可能也会更好。如果非要我猜的话,我会说这种方法的性能即使不是更好也至少会一样好(可能会更好)。还考虑到性能很大程度上取决于您的表上的索引。我怀疑如果这个表中有近170列,索引中是否有索引,那么我还没有真正使用这个列,但我会用您的解决方案和我已经做的方式来检查执行计划。让我们看看哪一个最适合我。无论如何,非常感谢您的帮助,干杯,朋友:)表1上的索引不需要太复杂,所以值得您尝试一下。当然,我不会在生产环境中这样做,但如果你能在开发环境中这样做,那就太好了。是的,我明天会在开发服务器上试一试。祈祷:)谢谢你的回复JRam:)G马斯特罗斯在他的回答中也包括了一些解释,无论如何,谢谢你的帮助,伙计。谢谢你的回复JRam:)G马斯特罗斯在他的回答中也包括了一些解释,无论如何,谢谢你的帮助,伙计。谢谢你的建议,有非常详细的答案和解释,我一定会尝试的。非常感谢:)感谢Bogdan的建议,并提供了非常详细的答案和解释。我一定会尝试的。非常感谢:)