1

2つの基準に基づいて、2つのデータベース間で一意のレコードを取得しようとしています。基準は次のとおりです。

  1. データがデータベース1(以下の私の例では@SCCM)で見つかった場合、そのデータが優先されます
  2. 選択したデータベース内のMAXリソースIDを取得します

これは、半分機能している例です。データベース設定は機能していますが、そのデータベース内の最大リソースIDは機能していません。現在、@SMSと@SCCMの両方の間で最大値を選択しています


DECLARE @SMS TABLE (
    name0 varchar(100),
    resid int
)

DECLARE @SCCM TABLE (
    name0 varchar(100),
    resid int
)

INSERT INTO @SMS
SELECT 'TEST', 1000 UNION
SELECT 'TEST', 1500 UNION
SELECT 'TEST1', 2000 UNION
SELECT 'TEST2', 3000 UNION
SELECT 'TEST3', 4000

INSERT INTO @SCCM
SELECT 'TEST', 100 UNION
SELECT 'TEST', 150 UNION
SELECT 'TEST1', 200 UNION
SELECT 'TEST2', 300

SELECT MIN(SMSDB) as SMSDB, MAX(Resid), Name0 FROM
(
    SELECT name0, resid, 2 as SMSDB FROM @SMS
    UNION ALL
    SELECT name0, resid, 1 as SMSDB FROM @SCCM
) as tbl
GROUP BY NAME0

推測される結果:

SMSDB | Resid | Name0
----------------------
1     | 150   | TEST
1     | 200   | TEST1
1     | 300   | TEST2
2     | 4000  | TEST3
4

2 に答える 2

1

パーティションを使用できます:

;WITH tbl as
(
    SELECT name0, resid, 2 as SMSDB FROM SMS
    UNION ALL
    SELECT name0, resid, 1 as SMSDB FROM SCCM
),
t as (
    SELECT *, 
           ROW_NUMBER()  
           over (partition By name0 order by SMSDB, resid desc ) 
           as rn
    FROM tbl
)
SELECT * FROM t
WHERE rn = 1

結果

| NAME0 | RESID | SMSDB | RN |
------------------------------
|  TEST |   150 |     1 |  1 |
| TEST1 |   200 |     1 |  1 |
| TEST2 |   300 |     1 |  1 |
| TEST3 |  4000 |     2 |  1 
于 2012-09-24T16:55:51.220 に答える
0

パーティションソリューションは実際にはもっと良いかもしれませんが、それは私の脳を傷つけます。SMSの値がSCCMに存在する場合、それらを除外するのはどうですか?

SELECT MIN(SMSDB) as SMSDB, MAX(Resid), Name0 FROM
(
    SELECT name0, resid, 2 as SMSDB FROM @SMS SMS
    WHERE NOT EXISTS (SELECT * FROM @SCCM WHERE name0 = SMS.name0)
    UNION ALL
    SELECT name0, resid, 1 as SMSDB FROM @SCCM
) as tbl
GROUP BY NAME0

あるいは

SELECT 1 as SMSDB, MAX(resid), name0  FROM @SCCM
GROUP BY name0
UNION ALL
SELECT 2 as SMSDB, MAX(resid), name0 FROM @SMS SMS
WHERE NOT EXISTS (SELECT * FROM @SCCM WHERE name0 = SMS.name0)
GROUP BY name0
ORDER BY name0
于 2012-09-24T18:37:45.620 に答える