更新表中的SQL Server查询问题

时间:2019-07-09 10:13:42

标签: sql sql-server

我有两个表Table1Table2

我想用以下格式的Table1中的数据更新Table2。 当JobId相同时,以逗号分隔的值:

Table1ColumnName Update = (Quantity * Length  [TYPE]  ---Table2 Column)

表1

enter image description here

表2

enter image description here

预期结果将与此非常相似

enter image description here

4 个答案:

答案 0 :(得分:0)

请尝试以下代码。请记住,UPDATE是一个冒险的操作,请首先尝试将代码与测试数据一起使用。

CommonUtility.stGetAccessTokenUrl = string.Format(CommonUtility.stGetAccessTokenUrl, CommonUtility.tenantID);
                myWebRequest = WebRequest.Create(CommonUtility.stGetAccessTokenUrl);
                myWebRequest.ContentType = "application/x-www-form-urlencoded";
                myWebRequest.Method = "POST";

                // Add the below body attributes to the request
                /*
                 *  grant_type  client_credentials  client_credentials
                 client_id  ClientID@TenantID 
                 client_secret  ClientSecret 
                 resource  resource/SiteDomain@TenantID  resourceid/abc.sharepoint.com@tenantID
                 */
                var postData = "grant_type=client_credentials";
                postData += "&client_id=" + CommonUtility.stClientID + "@" + CommonUtility.tenantID;
                postData += "&client_secret=" + (CommonUtility.stClientSecret);
                postData += "&resource=" + CommonUtility.resourceID + "/" + CommonUtility.stSiteDomain + "@" + CommonUtility.tenantID;
                var data = Encoding.ASCII.GetBytes(postData);

                using (var stream = myWebRequest.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                }
                var response = (HttpWebResponse)myWebRequest.GetResponse();

                var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

                string[] stArrResponse = responseString.Split(',');

                //get the access token and expiry time ,etc

                foreach (var stValues in stArrResponse)
                {

                    if (stValues.StartsWith("\"access_token\":"))
                    {
                        //Console.WriteLine(" Result => " + stValues);
                        accessToken = stValues.Substring(16);
                        //Console.WriteLine(" Result => " + accessToken);
                        accessToken = accessToken.Substring(0, accessToken.Length - 2);
                        // Console.WriteLine(" Result => " + accessToken);
                    }
                }

答案 1 :(得分:0)

尝试此查询:

update t1 set CD_ContrType = cast(t2.Quantity as varchar(10)) + '*' + t2.Length
from table1 t1
join table2 t2 on t1.MainJob_Id = t2.MainJob_Id

答案 2 :(得分:0)

这可能是个坏主意。通常,存储逗号分隔的值不是一个好方法。但是,如果您只是出于演示目的而这样做,则可能不是一个坏主意。

在SQL Server中,可以将FOR XML PATH用于字符串连接:

update t1
    set cd_contrtype = t2.new_cd_contrtype
    from table1 t1 join
         (select t2.main_job_id,
                 stuff( (select concat(', ', tt2.quantity, ' * ', tt2.length, ' ', tt2.type)
                         from table2 tt2
                         where tt2.main_job_id = t2.main_job_id
                         for xml path ('')
                        ), 1, 2, ''
                      ) as new_cd_contrtype
          from (select distinct main_job_id from table2 t2) t2
          group by t2.main_job_id
         ) 
         on t2.main_job_id = t1.main_job_id

答案 3 :(得分:0)

请检查此查询,但是我建议您重新考虑您的方法,因为存储逗号分隔值不是一个好主意:

创建示例数据

Declare @Table1 table(
CD_Contr_Type varchar(250), 
MainJob_Id varchar(100)
)
Insert into @Table1 values (NULL, '201900002')
Insert into @Table1 values (NULL, '201900004')
Insert into @Table1 values (NULL, '201900006')
Insert into @Table1 values (NULL, '201900008')
Insert into @Table1 values (NULL, '201900010')
Insert into @Table1 values (NULL, '201900012')
Insert into @Table1 values (NULL, '201900013')
Insert into @Table1 values (NULL, '201900015')

Declare @Table2 table(
MainJob_Id varchar(100),
Quantity decimal(5,3),
Length varchar(20),
Type varchar(100)
)
Insert into @Table2 values('201900002', 1.000, '20Feet', 'Flat Rate')
Insert into @Table2 values('201900004', 1.000, '20Feet', 'Bulk')
Insert into @Table2 values('201900004', 2.000, '40Feet', 'Bulk')
Insert into @Table2 values('201900006', 1.000, '20Feet', 'General Purpose')
Insert into @Table2 values('201900008', 1.000, '20Feet', 'Bulk')
Insert into @Table2 values('201900010', 1.000, '20Feet', 'Bulk')
Insert into @Table2 values('201900012', 1.000, '20Feet', 'High Cube')
Insert into @Table2 values('201900013', 1.000, NULL, 'Loose Cargo')
Insert into @Table2 values('201900015', 1.000, '20Feet', 'General Purpose')

最终更新查询

Update A set CD_Contr_Type = UpdateVal from @Table1 A inner join (
Select MainJob_Id, 
(Select Cast(Cast(Quantity as int) as varchar) + ' * ' + Length + ' ' + Type + ', ' 
from @Table2 t2 
where t2.MainJob_Id = t1.MainJob_Id for XML Path('')) as UpdateVal 
from @Table1 t1 
group by MainJob_Id) B on A.MainJob_Id = B.MainJob_Id