2

私はこの情報を含むビューを持っています:

TableA (IDTableA、IDTableB、IDTableC、アクティブ、日付、...)

の各レジスタTableAと の各レジスタについて、最大の日付を持ち、アクティブなtableCレジスタが必要です。tableB

select IDTableA, IDtableC, IDTableB, Date, Active
from myView
where Active = 1
group by IDTableA, IDTableC
Having Max(Date)
order by IDTableA;

このクエリは で動作しますSQLiteが、このクエリを で試すと、 in が句に含まれていないというSQL Serverエラーが表示されます。IDTableBselectgroup

理論的には、SQLite の最初のクエリは機能しないはずですが、機能することはわかっています。

SQL Server でこのクエリを実行するにはどうすればよいですか?

ありがとう。

4

3 に答える 3

2

SQL 92 によると、GROUP BY句を使用する場合、SELECT出力式リストでは、GROUP BYリストに記載されている列またはその他の列のみを使用できますが、、、、、などの集約関数でラップcount()するsum()必要avg()がありますmax()min()

MSSQL、Postgres などの一部のサーバーはこのルールに厳密ですが、たとえば MySQL や SQLite は非常にリラックスしており、寛大です。これがあなたを驚かせた理由です。

簡単に言えば、これを MSSQL で機能させたい場合は、SQL92 の要件に従ってください。

于 2013-02-09T09:49:51.313 に答える
2

SQLServer でのこのクエリ

select IDTableA, IDtableC, IDTableB, Date, Active
from myView v1
where Active = 1
  AND EXISTS (
              SELECT 1
              FROM myView v2
              group by v2.IDTableA, v2.IDTableC
              Having Max(v2.Date) = v1.Date
              )
order by v1.IDTableA;

また

また、SQLServer2005+ では、ROW_NUMBER で CTE を使用できます。

;WITH cte AS
 (              
  select IDTableA, IDtableC, IDTableB, [Date], Active,
         ROW_NUMBER() OVER(PARTITION BY IDTableA, IDTableC ORDER BY [Date] DESC) AS rn
  from myView v1
  where Active = 1
  )
  SELECT *
  FROM cte
  WHERE rn = 1
  ORDER BY IDTableA
于 2013-02-09T10:44:53.147 に答える
1

これを試して、

select * from table1 b
where active = 1
and date = (select max(date) from table1
            where idtablea = b.idtablea
            and idtablec = b.idtablec
            and active = 1);

SQLFIDDLE デモ

于 2013-02-09T09:49:39.120 に答える