2

我有一个看起来像这样的表:

  ID               AMID           DESC                  value 
  -----------------------------------------------------------------
  100              type A         AMID type A             10
  101              type B         AMID type B             18
  102              type C         AMID type C             34
  101               null            null                   4
  102               null            null                  19
  103              type D         AMID type D              6   
  103              type E            null                  7 

该表包含大约 600 万行。

现在我想要这样的结果

  ID               AMID           DESC                  value 
  -------------------------------------------------------------
  100              type A         AMID type A             10
  101              type B         AMID type B             18
  102              type C         AMID type C             34
  101              type B         AMID type B              4
  102              type C         AMID type C             19
  103              type D         AMID type D              6   
  103              type E            null                  7

当两行中的 ID 的 AMID 相等时,它显示相同的值,其中一个为空,如果 AMID 不同,则保持原样..

在此先感谢您的帮助..

干杯,

哈里什

4

3 回答 3

2

如果我正确理解了您的要求:

SELECT ID
,      COALESCE(AMID, (
           SELECT TOP 1 AMID FROM Table t2 WHERE t2.ID=ID AND t2.AMID IS NOT NULL
       ))AS AMID
,      DESC                  
,      value  
FROM Table

COALESCE(事务处理 SQL)

于 2012-04-30T12:46:49.233 回答
2

首先,让我们设置一些适当的 DDL 和示例数据:

USE tempdb;
GO

CREATE TABLE dbo.AMID
(
  ID     INT, 
  AMID   VARCHAR(32), 
  [DESC] VARCHAR(32), 
  value  INT
);

INSERT dbo.AMID SELECT 100, 'type A', 'AMID type A', 10
      UNION ALL SELECT 101, 'type B', 'AMID type B', 18
      UNION ALL SELECT 102, 'type C', 'AMID type C', 34
      UNION ALL SELECT 101,  null   , null         , 4
      UNION ALL SELECT 102,  null   , null         , 19
      UNION ALL SELECT 103, 'type D', 'AMID type D', 6   
      UNION ALL SELECT 103, 'type E', null         , 7;

与其使用没有 ORDER BY 的 TOP,我什至不知道这意味着什么,您可以准确地选择一行用于使用分区 + 顺序填充 NULL 行。在您有限的样本数据中,任何 ID 最多只有两行,但如果您可以拥有更多,这很重要(否则,就像没有 ORDER BY 的 TOP 一样,您将拉一些任意行,进行更新低于预期)。这按AMID列中的值排序,但您可以更改它以ID使用表中的任何条件选择第一行。

;WITH src AS 
(
  SELECT ID, AMID, [DESC]
  FROM dbo.AMID 
  WHERE AMID IS NULL AND [DESC] IS NULL
),
nv AS 
(
  SELECT ID, AMID, [DESC], rn = ROW_NUMBER() OVER
  (PARTITION BY ID ORDER BY AMID) -- change this ordering accordingly
  FROM dbo.AMID 
  WHERE AMID IS NOT NULL
)
UPDATE src
  SET AMID = nv.AMID, [DESC] = COALESCE(nv.[DESC], src.[DESC])
FROM src INNER JOIN nv
ON src.ID = nv.ID
WHERE nv.rn = 1;

SELECT ID, AMID, [DESC], Value FROM dbo.AMID;

结果:

ID   AMID    DESC         value
---  ------  -----------  -----
100  type A  AMID type A  10
101  type B  AMID type B  18
102  type C  AMID type C  34
101  type B  AMID type B  4
102  type C  AMID type C  19
103  type D  AMID type D  6
103  type E  NULL         7     

不要忘记清理:

DROP TABLE dbo.AMID;
GO

顺便说一句,DESC是一个可怕的列名称,因为它是一个 T-SQL 关键字,因此必须始终使用[double quotes].

于 2012-05-22T16:09:39.520 回答
1
select a1.ID,
ISNULL(a1.amid, a3.amid),
a1.[DESC],
a1.value
FROM amid a1
LEFT OUTER JOIN (select a2.id, amid = max(a2.amid)
    from amid a2
    where  a2.amid is not null
    group by a2.id) a3 on a3.id = a1.id

从您的问题中不清楚您使用的是什么版本的 SQL,但上述内容应该适用于 SQL2000 及以上的任何内容。

基本上,您可以调整派生表中的查询以获得您喜欢的结果。

于 2012-04-30T12:57:41.853 回答