Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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 如果不将列名包含在group by中,则无法按列排序_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如果不将列名包含在group by中,则无法按列排序

Sql 如果不将列名包含在group by中,则无法按列排序,sql,sql-server,tsql,Sql,Sql Server,Tsql,如果不在group by中包含列名,则无法按查询排序。正在尝试使用next LASTER not null值更新最新记录。但当我更新记录时,会考虑随机非空值,而不是下一个最新的非空值,因为除非包含在group by中,否则无法执行order by 表A ID Name zip city Mdate 10001 Sarah NULL NULL 02-20-2018 00:10:40:000 98765 AJ NULL Asia 03-25-2018 1

如果不在group by中包含列名,则无法按查询排序。正在尝试使用next LASTER not null值更新最新记录。但当我更新记录时,会考虑随机非空值,而不是下一个最新的非空值,因为除非包含在group by中,否则无法执行order by

表A

  ID     Name   zip  city  Mdate
  10001  Sarah  NULL NULL  02-20-2018 00:10:40:000
  98765  AJ     NULL Asia  03-25-2018 10:10:45:000
  12345  NULL   7511 Texas 03-20-2018 22:10:00:000
表B

  ID     RollNo     Cdate
  12345   1    01-18-2018
  12345   2    01-22-2018
  12345   3    03-20-2018 
  98765   9    01-18-2018
  98765   8    01-22-2018
  98765   7    03-20-2018
  10001   10   03-08-2018 
  10001   11   01-15-2018
  10001   12   02-20-2018
表C

  Rollno Name  Zip  City  Mdate
    1    NULL  7511 Texas 01-18-2018 15:10:00:000 
    2    John  5001 NULL 01-22-2018 10:05:00:000
    3    NULL  7000 Rome 03-20-2018 22:10:00:000
    10   Sarah NULL NULL 03-08-2018 01:00:20:000
    11   Tom   5500 NULL 01-15-2018 15:10:00:000
    12   NULL  4500 Pune 02-20-2018 00:10:40:000
    9    AJ    NULL Asia 01-18-2018 23:01:02:000
    8    MATT  NULL Ohio 01-22-2018 20:00:05:000
    7    NULL  8000 NULL 03-25-2018 10:10:45:000 
查询:

    Update #temp SET Name = C.name
    Zip = C.ZIP
    ,City=C.city

   FROM
   (
   SELECT A.ID,
   CASE 
   WHEN MAX(A.Name) IS NULL THEN MAX(C.Name) 
   ELSE Max(A.Name) 
   END Name,
   CASE
   WHEN MAX(A.Zip) IS NULL THEN Max(C.Zip)
   ELSE MAX(A.Zip)
   END Zip,
   CASE 
   WHEN MAX(A.City) IS NULL THEN Max(C.City) 
   ELSE MAX(A.City) 
   END City,
   A.Mdate
   FROM table_a A
   INNER JOIN Table_B B ON A.ID = B.ID
   INNER JOIN table_c C ON B.RollNo = C.RollNo
   GROUP BY A.ID,A.Mdate
   )
结果集:

   ID     Name   zip  city  Mdate
  10001  Sarah  5500 Pune  03-08-2018 01:00:20:000
  98765  AJ     8000 Asia  03-25-2018 10:10:45:000 
  12345  John   7511 Rome  03-20-2018 22:10:00:000 
实际产量:

   ID     Name   zip  city  Mdate
  10001  Sarah  4500 Pune  03-08-2018 01:00:20:000
  98765  MATT   8000 ohio  03-25-2018 10:10:45:000 
  12345  John   7000 Rome  03-20-2018 22:10:00:000 

如果最新记录包含空值,则应更新下一个最新的非空值记录。在查询中,无法为表C mdate提供orderby。我已将最新的值放入临时表,并仅对特定列执行更新

下面是我如何在子查询中进行排序,这不会生成您要查找的结果集原始查询也不会从提供的数据集生成实际输出,但这是我将用于解决问题的方法

create table #temp (id int, name char(5), zip char(5), city char(5));

       declare @table_a table (id int, name char(5), city char(5), zip char(5), mdate datetime);

       insert @table_a
       values(10001,  'Sarah',  NULL, NULL,  '02-20-2018 00:10:40:000'),
       (98765,  'AJ',     NULL, 'Asia',  '03-25-2018 10:10:45:000'),
       (12345,  NULL,   7511, 'Texas', '03-20-2018 22:10:00:000');

       declare @table_b table (id int, rollno int, Cdate datetime);

       insert @table_b ( ID,     RollNo,     Cdate)
       values
  (12345,   1,    '01-18-2018'),
  (12345,   2,    '01-22-2018'),
  (12345,   3,    '03-20-2018'),
  (98765,   9,    '01-18-2018'),
  (98765,   8,    '01-22-2018'),
  (98765,   7,    '03-20-2018'),
  (10001,   10,   '03-08-2018'), 
  (10001,   11,   '01-15-2018'),
  (10001,   12,   '02-20-2018');

       declare @table_c table ( rollno int, name char(5), city char(5), zip char(5),mdate datetime);

       insert @table_c(  Rollno, Name,  Zip,  City,  Mdate)
       values
    (1,    NULL,  7511, 'Texas', '01-18-2018 15:10:00:000'), 
    (2,    'John',  5001, NULL, '01-22-2018 10:05:00:000'),
    (3,    NULL,  7000, 'Rome', '03-20-2018 22:10:00:000'),
    (10,   'Sarah', NULL, NULL, '03-08-2018 01:00:20:000'),
    (11,   'Tom',   5500, NULL, '01-15-2018 15:10:00:000'),
    (12,   NULL,  4500, 'Pune', '02-20-2018 00:10:40:000'),
    (9,    'AJ',    NULL, 'Asia', '01-18-2018 23:01:02:000'),
    (8,    'MATT',  NULL, 'Ohio', '01-22-2018 20:00:05:000'),
    (7,    NULL,  8000, NULL, '03-25-2018 10:10:45:000');

       declare @count int = coalesce((select count(*) from #temp), 100);

    --Update t SET t.Name = C.name,
    --t.Zip = C.ZIP,
    --t.City=C.city

select * 
   FROM
   (
   SELECT top (@count) A.ID,
   CASE 
   WHEN MAX(A.Name) IS NULL THEN MAX(C.Name) 
   ELSE Max(A.Name) 
   END Name,
   CASE
   WHEN MAX(A.Zip) IS NULL THEN Max(C.Zip)
   ELSE MAX(A.Zip)
   END Zip,
   CASE 
   WHEN MAX(A.City) IS NULL THEN Max(C.City) 
   ELSE MAX(A.City) 
   END City,
   A.Mdate
   FROM @table_a A
   INNER JOIN @Table_B B ON A.ID = B.ID
   INNER JOIN @table_c C ON B.RollNo = C.RollNo
   GROUP BY A.ID,A.Mdate
   order by A.Mdate
   ) C 


   drop table #temp;

如果需要在C派生表中的Mdate上进行排序,我会使用一个变量,该变量是根据要在temp表中更新的行数构建的,用于填充子查询中的top语句。这样您就可以控制订单。

请解释您想要完成的任务。子查询中的ORDER BY通常不有用。对于子查询,如果您在排序中需要首选项,请使用select top,这样您可以根据null的存在对数据进行排序values@GordonLinoff我需要根据最新修改日期使用表C中的not null值更新null。其中,我的查询不是更新空值,而是随机更新。希望您得到it@DwightReynoldson根据我的查询,你能举个例子吗?我尝试了很多方法,但都没有得到结果。你对数据的排序和你所说的期望输出不匹配。请看一下ID 10001。根据最近的非空值,名称将是Tom。但你说应该是莎拉。zip也有同样的问题。按日期计算是4500,但你说应该是5500。这里真正的问题是您似乎从不同的行中提取某些值。这是一个巨大的危险信号,表明你的设计不够理想。