加入两个表返回唯一的KeyID

时间:2015-09-11 04:11:23

标签: sql sql-server-2012

我有这张桌子:

CREATE TABLE SETTINGS
   ([AccountNumber] int, [KeyID] int, [KeyValue] varchar(50))
;

INSERT INTO SETTINGS
   ([AccountNumber], [KeyID], [KeyValue])
      VALUES 
      (null, 1, 'welcome'),
      (null, 2, 'defaultaccount'),
      (null, 3, 'greetings'),
      (1234567, 2,'customaccount');
;

enter image description here

我要完成的是返回具有唯一KeyID的行。在某些情况下,我会出现两次相同的KeyID,但对于一行,AccountNumber不会为空。在这种情况下,我想返回AccountNumber不为空的行。

我正试图获得输出:

enter image description here

为了获得输出,我为每条记录创建了rownumber,然后尝试加入rownumber=1的表格。但我不知道如何排除KeyID匹配但AccountNumber is null匹配的行。

这是我的代码。

;WITH singleRow AS (
 SELECT * , ROW_NUMBER() OVER (PARTITION BY KEYID ORDER BY KEYID) as rownum
 FROM SETTINGS);

 SELECT s.KeyID FROM SETTINGS s
   JOIN singleRow r
   ON  s.keyid = r.keyid
   AND r.rownum = 1  

在这种情况下我应该使用两个临时表吗?在第一个临时表中存储具有唯一KeyID的所有行,其中AccountNumber is null。在第二个商店中只有AccountNumber is not null行。然后加入桌子?似乎我过于复杂了。

这是SQL FIDDLE

1 个答案:

答案 0 :(得分:2)

<强> SqlFiddleDemo

;WITH singleRows AS 
 (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY keyid ORDER BY AccountNumber DESC)
      AS rownum
    FROM settings
 )
SELECT [AccountNumber], [KeyID], [KeyValue]
FROM singleRows
WHERE rownum = 1;