【问题标题】:In SQL Server, how can I compare rows using the column names from another table在 SQL Server 中,如何使用另一个表中的列名比较行
【发布时间】:2010-07-09 10:11:04
【问题描述】:

我有两个表 A 和 B,有动态列,我不知道其中哪些列是关键,除了另一个名为 C 的表。

C 表指定表 A 和 B 中哪一列是键列。可以有 1 个或多个键列。

我的问题是,我将如何生成这样一个查询,其中我从 A 中选择所有行,其中键列等于 B 中的相同键列?

我的一个想法是创建一个使用 sp_executesql 执行的文本查询,但我需要一些关于如何生成查询的好主意。

首先,我将从表 C 中为表 A 和 B 选择所有键列到我声明的表 @keyColumns。

然后我会使用 while 循环遍历 @keyColumns 中的所有键列并生成查询并使用 sp_executesql 执行它。

例如:

UPDATE A 
SET ... 
FROM B INNER JOIN A 
ON A.keycol1 = B.keycol1 AND A.keycol2 = B.keycol2 AND ...

为了清楚起见,C表只为表B指定了键列,据我所知A具有相同的键列。

但我想知道是否有更好的方法来解决这个问题。

【问题讨论】:

    标签: sql sql-server dynamic-sql dynamic-columns


    【解决方案1】:

    'C' 中的键列是主键吗?如果是这样,您可以按照here 的描述从INFORMATION_SCHEMA.TABLE_CONSTRAINTSINFORMATION_SCHEMA.KEY_COLUMN_USAGE 检索这些,而不是使用不同的表。

    我认为您必须为此使用动态 SQL。没有像FROM B JOIN A ON PRIMARY KEYS 这样的语法。而不是WHILE 循环,但您可以通过SELECT 连接您的查询,如下所示。

    DECLARE @DynSql nvarchar(max)
    DECLARE @TableA sysname
    DECLARE @TableB sysname
    
    SET @TableA = 'A'
    SET @TableB = 'B';
    
    WITH C AS
    (
    SELECT 'B' AS [Table], 'keycol2' As col UNION ALL
    SELECT 'B' AS [Table], 'keycol1' As col UNION ALL
    SELECT 'X' AS [Table], 'keycol1' As col
    )
    
    SELECT @DynSql = ISNULL(@DynSql + ' AND ','')+ @TableA + '.'+QUOTENAME(col) + '= ' + @TableB + '.'+QUOTENAME(col)
    FROM C WHERE [Table] = @TableB
    
    IF @@ROWCOUNT=0
    RAISERROR('No Entry found for table %s',16,1,@TableB)
    
    SET @DynSql = 
    'UPDATE ' + @TableA + ' 
    SET ... 
    FROM ' + @TableB + '  INNER JOIN ' + @TableA + ' ON  
    ' + @DynSql
    
    PRINT @DynSql
    

    【讨论】:

    • 谢谢。这似乎是最好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多