Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 一个表中的多个列引用回一个表以获取其值_Sql Server_Sql Server 2008_Tsql_Sql Server 2008 R2 - Fatal编程技术网

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的建议,并提供了非常详细的答案和解释。我一定会尝试的。非常感谢:)