0

自分自身と結合して不足しているアイテムを見つける必要があるテーブルがあり、行き詰まっています。たぶんそれは経験の浅い問題かもしれませんが、私は自分が望むことを達成するためのループの観点からしか考えることができないようです。

基本的に、表は次のとおりです。

    packageID     Server
      1           baseline
      2           baseline
      3           baseline
      1           server1
      3           server1
      2           server2
      3           server2

私が達成したいと思っているのは、各サーバーから欠落しているパッケージを見つけることです。私は次のようにサーバーごとにこれを取得できます:

    SELECT base.*, ISNULL(dp.server,'server1') as Server
    FROM (SELECT DISTINCT packageID FROM DB1
          WHERE server = 'baseline') base
    LEFT OUTER JOIN 
         (SELECT packageID, server FROM DB1
          WHERE server = 'server1') dp
   WHERE dp.server IS NULL

これにより、個々のサーバーベースで必要なものが得られます。

    packageID     Server
       2          server1 

特定のサーバーがベースラインから欠落している各パッケージのリストを取得するにはどうすればよいですか?

4

2 に答える 2

1

SERVERSのリストを含むビューを想定し、それをテストできないので疑似SQLと見なすと、このようなものがうまくいくはずです...

SELECT base.packageID, servers.server, 
             (SELECT count(*) 
                FROM base AS b1
               WHERE b1.packageId = base.packageId
                 AND b1.server    = servers.server) deployed
  FROM base, servers
 WHERE base.server = 'baseline'
   AND deployed = 0;
于 2013-03-15T11:31:55.667 に答える
0

このスクリプトを試してください、

      DECLARE @DB1 TABLE
(
    PackageID INT
    ,Server VARCHAR(50)
)


INSERT INTO @DB1 VALUES(1,'baseline')
INSERT INTO @DB1 VALUES(2,'baseline')
INSERT INTO @DB1 VALUES(3,'baseline')
INSERT INTO @DB1 VALUES(1,'server1')
INSERT INTO @DB1 VALUES(3,'server1')
INSERT INTO @DB1 VALUES(2,'server2')
INSERT INTO @DB1 VALUES(3,'server2')

;WITH CTE_Package AS
(
    SELECT DISTINCT PackageID 
        , ROW_NUMBER() OVER(order by PackageID) AS ID
    FROM @DB1
)
,CTE_Servers AS
(
    SELECT DISTINCT Server 
        , ROW_NUMBER() OVER(order by PackageID) AS ID
    FROM @DB1
)
,CTE_Server_Packages AS
(
    SELECT DISTINCT P.PackageId, S.Server   
    FROM CTE_Servers S
    CROSS JOIN CTE_Package P    
)
SELECT Server, PackageID
FROM 
(
    SELECT SP.Server, SP.PackageID , D.PackageID [ActualPackage], D.Server [ActualServer]
    FROM CTE_Server_Packages SP
    LEFT JOIN @DB1 D
            ON D.PackageID = SP.PackageID
            AND D.Server = SP.Server
) AS TEMP
WHERE TEMP.ActualServer IS NULL
于 2013-03-15T11:56:37.633 に答える