2016-05-06 10 views
0

クエリを使用して、サーバー上の各データベースの最新のバックアップの詳細を取得しようとしています。テーブルを自分自身に結合するときに不完全な行セットが返される

クエリがある:私はこれを実行すると

WITH CTE_max as 
( 
    SELECT bs2.database_name,MAX(bs2.backup_start_date) as maxdate 
    FROM msdb.dbo.backupset bs2 GROUP BY database_name 
) 

SELECT DISTINCT 
    CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server, 
    bs1.database_name, 
    bs1.backup_start_date, 
    bs1.backup_finish_date, 
FROM msdb.dbo.backupset bs1 
    INNER JOIN CTE_max CTE ON bs1.backup_start_date = CTE.maxdate 
ORDER BY 
    bs1.database_name, 
    bs1.backup_start_date desc 

、それだけでサーバー上のデータベースの約半分の詳細を返します。私は、メインクエリのサブクエリでCTEを置き換えてみて、それらに参加する前にvarcharsに日付をキャストしましたが、結果は同じです。

CTEクエリを単独で実行すると、すべてのデータベースの結果が返されますが、メインクエリで結合されるとすぐに結果の半分が消えます。私はテーブルがそれ自身に結合されているので、これがどのように可能であるかに関していくらか難解です。

アドバイスをいただければ幸いです!

+0

また、database_nameで結合する必要があります。 'distinct'が結果セットを乱しているなら、私は驚くことはありません。 – HoneyBadger

+0

@ HoneyBadgerありがとう、ちょうどそれを試みたが、結果は同じままです。 – Blimbeard

+0

サンプルデータはありますか?理想的には、結果セットに含まれていないCTEで選択されたレコード。 – HoneyBadger

答えて

0

このようにして、結合条件にDBNameを追加すると、テスト用のサンプルデータがよりよくポストされます。

WITH CTE_max as 
( 
    SELECT bs2.database_name,MAX(bs2.backup_start_date) as maxdate 
    FROM msdb.dbo.backupset bs2 GROUP BY database_name 
) 

SELECT CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server, 
    bs1.database_name, 
    bs1.backup_start_date, 
    bs1.backup_finish_date 
FROM msdb.dbo.backupset bs1 
    INNER JOIN CTE_max CTE ON bs1.backup_start_date = CTE.maxdate 
    AND bs1.database_name=CTE.database_name 
ORDER BY 
    bs1.database_name, 
    bs1.backup_start_date desc 
関連する問題