0

以下のようにSQL Serverにテーブルがあります。テーブル名: LANDS

Land_ID   UID             DM_DATE              DEL_REASON
   1       5     2013-05-21 20:31:53.773        Reason1
   1       1     2013-05-21 20:45:21.610        Reason2
   1       1     2013-05-21 20:45:27.613        Reason3

最新の DM_DATE の DEL_REASON を取得したい (最後に入力された日付の理由の値を取得する) は、(Reason3) を意味します。

このselectステートメントを書きましたが、このエラーが発生します"An expression of non-boolean type specified in a context where a condition is expected, near ')'"

select [DEL_REASON] from [LANDS] where [Land_ID]='1' AND [UID] ='1' AND MAX([DM_DATE]) 

誰か助けてくれませんか。

4

4 に答える 4

1

通常、別のクエリで最大日付を取得し、それ自体に参加します。

select l.del_reason
from lands l
    join (
        select max(dm_date) maxdm_date, land_id, uid
        from lands
        group by land_id, uid
    ) l2 on l.land_id = l2.land_id 
            and l.uid = l2.uid 
            and l.dm_date = l2.maxdm_date
where l.land_id = 1 and l.uid = 1

編集 -- @AaronBertrand が示唆するように、別の代替アプローチは、SQL Server 2008 を使用しているため、分析関数を使用することです。これにより、論理読み取りが少なくなるためROW_NUMBER()、使用するよりもはるかに優れたパフォーマンスが得られます。MAX両方のクエリの実行計画を確認すると、特にテーブルのサイズが大きくなると、分析関数を使用してクエリのコストが大幅に削減されることがわかります。

select del_reason
from (
    select del_reason, land_id, uid, 
        row_number() over (partition by land_id, uid order by dm_date desc) rn
    from lands
) l
where l.land_id = 1 and 
    l.uid = 1 and
    l.rn = 1

または、おそらくさらに単純です:

select del_reason
from (
    select del_reason, 
        row_number() over (order by dm_date desc) rn
    from lands
    where land_id = 1 and uid = 1
) l
where l.rn = 1
于 2013-05-21T18:41:11.603 に答える
1

クエリ:

SQLFIDDLE例

select TOP 1 [DEL_REASON] 
from [LANDS] 
where [Land_ID]='1' 
AND [UID] ='1' 
ORDER BY [DM_DATE] DESC 

結果:

| DEL_REASON |
--------------
|    Reason3 |
于 2013-05-21T18:43:36.173 に答える
0

サブクエリを排除するために、これには共通のテーブル式を使用するのが好きです。

with max_date (land_id,uid,max_date)
as
(
    select land_id, uid, max(dm_date)
    from LANDS
    group by land_id,uid
)

select del_reason
from LANDS
inner join max_date
on LANDS.land_id = max_date.land_id
and LANDS.uid = max_date.uid
and LANDS.dm_date = max_date.max_date
于 2013-05-21T18:52:57.803 に答える
-1

1位

select [DEL_REASON] from [LANDS] where [Land_ID]='1' AND [UID] ='1' AND MIN([DM_DATE])

2位

この select ステートメントを書きましたが、「')' の近くで、条件が期待されるコンテキストで指定された非ブール型の式の式」というエラーが表示されます。

[UID] データ型がブール値で宣言されている可能性があるため、そうであると答えてください データベースを確認し、[UID] がブール値の場合は int に変更します

これがあなたを助けることを願っています

于 2013-05-21T18:40:43.313 に答える