3

次の表があるとします。

InstalledApps

MachineName | AppName | Version
-------------------------------
machine01   | App01   | 1.1
machine01   | App02   | 1.0
machine01   | App03   | 1.5
machine02   | App04   | 2.0
machine02   | App02   | 1.0
machine02   | App01   | 1.1
machine03   | App06   | 7.9.9
machine03   | App01   | 1.1
machine03   | App07   | 11.5
machine03   | App02   | 1.0

Apps与えられた「n」台のマシンに共通するものを選択する必要があります。これは「n」セット間の交差です。しかし、私はまともなクエリを思い付くのに苦労しています。

私はこのようなことができることを知っています:

SELECT AppName, Version 
FROM InstalledApps 
WHERE MachineName = 'machine01'

INTERSECT

SELECT AppName, Version 
FROM InstalledApps 
WHERE MachineName = 'machine02' 

それは私に与えます

AppName | Version
------------------
App01   | 1.1
App02   | 1.0

しかし、事前にマシンの数を知らなくてもそれを実行できる方法はありますか?何かのようなもの

SELECT...... 
FROM InstalledApps 
WHERE MachineName IN ('machine01',...'machine99')
4

4 に答える 4

4

私はこれが一般的な場合にそれを行うべきだと思います:

SELECT AppName, Version, COUNT(DISTINCT(MachineName)) AS MachineCount
FROM InstalledApps
GROUP BY
  AppName, Version
HAVING
  COUNT(DISTINCT(MachineName)) > 1
于 2012-05-30T14:20:13.743 に答える
1

マシン名でRow_Number関数とデータを使用できますPartition

Select AppName, [Version] From 
(
    Select Row_Number() Over(Partition By MachineName Order by AppName) RowId, * 
    From InstalledApps
)K
Where K.RowId = 2
于 2012-05-30T16:41:53.967 に答える
0

INクエリをパラメータ化できます

Declare @value varchar(max)
Declare @sql varchar(max)
select @value = 'machine1,machine2,machine3'
SELECT @sql = 'SELECT * FROM InstalledApps  WHERE MachineName in (' + @value+ ')'

 exec sp_executeSQL @sql 

または、サブクエリを使用してすべての値を取得することもできます

SELECT * FROM InstalledApps WHERE MachineName in (SELECT MachineName FROM InstalledApps    group by MachineName HAVING COUNT(DISTINCT(MachineName)) > 1)
于 2012-05-30T14:21:32.837 に答える
0

によるグループ化でこれを行うことができます。InstalledAppsテーブルに特定のアプリの重複マシンがないと仮定します。

select apps
from InstalledApps
group by apps
having sum(case when machine in (<list of machines>) then 1 else 0 end) = <number of machines>

マシンに重複するアプリがある場合:

select apps
from (select distinct apps, machine from InstalledApps) ia
group by apps
having sum(case when machine in (<list of machines>) then 1 else 0 end) = <number of machines>

また、マシンの数を数えたくない場合は、動的SQLを使用するか、マシン名を一時テーブルに格納する必要があると思います。

于 2012-05-30T19:45:17.463 に答える