将nvarchar中的属性映射到具有int数据类型的另一列

时间:2018-10-11 15:21:41

标签: sql sql-server sql-server-2012

我将其作为传统,似乎无法在T-SQL ...(?)中解决。

我需要将表A的一列映射到表B的另一列,此映射是使用参数化表完成的。所有3个表都在同一应用程序的同一服务器中。临时表是一个中间表,用于接收外部数据,然后它将在映射后将最终表馈入干净。

Table_a(临时表)

ID    NAME   rack     object
-----------------------------
1     x       y       zz:zz1   
2     x       y       zz:zz2

table_b(干净表-映射之前)

ID  Name    rack   object
--------------------------
230  x        y    null
245  x        y    null

我想在映射后实现下一个table_b。

Table_b(干净表-映射后的最终表)

ID  Name     rack   object
---------------------------
230  x        y        10
245  x        y        11

如果同一名称/机架的ID不同,如何关联两个表。例如,表A的名称/机架的ID为1,分别为x和y。表B的相同情况在ID 230下。

table_parametrization

Id   nameObject
---------------
10   zz:zz1
11   zz:zz2

object中的列table_anvarchar类型,而object中的列table_bint类型。

我什至不知道如何在T-SQL中实现它。

2 个答案:

答案 0 :(得分:1)

我在这里做出一些疯狂的假设,但我将带您逐步了解。

如果table_atable_b之间的连接不牢固,并且可能有重复的(name,rack)对,则您可能希望一次进行一次更新。

首先,将登台表的内容放入临时表中。在此过程中,我们将要从临时表中删除行,因此您可能不想直接使用table_a执行此操作。有了这些信息后,我们将使用WHILE循环遍历记录,并一次更新table_b一条记录。

DECLARE @A_ID INT

WHILE EXISTS (SELECT TOP 1 1 FROM #table_a)
BEGIN

    --Get one ID value at a time
    SELECT TOP 1 @A_ID = id 
    FROM #table_a

    --the CTE gets the first record from table_b that needs an [object] value set
    ;WITH Top1B AS
    (
        SELECT TOP 1 b.id, objectId = p.id
        FROM #table_b b
        INNER JOIN #table_a a ON a.[name] = b.[name] AND a.rack = b.rack
        INNER JOIN #table_param p ON p.nameObject = a.object
        WHERE a.id = @A_ID
            AND b.object IS NULL
    )
    UPDATE b
    SET b.[object] = tb.objectId
    FROM Top1B tb
    INNER JOIN #table_b b ON b.id = tb.id

    --remove the record from the staging table
    DELETE #table_a
    WHERE id = @A_ID
END

答案 1 :(得分:0)

假设您的qs1 = views.some_model.objects.filter(start_gt=some_date_var).order_by('start') qs2 = views.some_model.objects.all() qs1.union(qs2) 属性是table_b.ID,并且是自动生成的,则需要使用对象将IDENTITY JOINtable_a。您将使用类似以下内容的值插入table_parameterization中:

B