Оператор SQL с подвыбором - PullRequest
1 голос
/ 03 февраля 2012
   select case when exists(
                              select top 1 1 
                              from dg_world_records wr (nolock) 
                              where wr.gametypeid = 4 
                              and wr.playerid = 1
                           ) 
    then totaltime = (select min(totaltime) from dg_world_records (nolock) where playerid = 1 and gametypeid = 4)
    else totaltime = (select max(totaltime) from dg_world_records (nolock) where gametypeid = 4)
    end

Я предполагаю, что это не может быть сделано, но я пытаюсь выполнить отбор в выражении SQL. Это возможно?

Я пытаюсь сделать поиск, основанный на поиске или не нахождении значения в таблице. Я могу сделать это, разбив утверждение, но мне было интересно, возможно ли сделать это в одном утверждении.

Вот схема таблицы:

CREATE TABLE [dbo].[DG_WORLD_RECORDS](
[WorldRecordId] [int] IDENTITY(1,1) NOT NULL,
[GameTypeId] [int] NOT NULL,
[PlayerId] [int] NOT NULL,
[NumberOfValues] [int] NOT NULL,
[TotalTime] [int] NOT NULL,
[DateOfRecord] [datetime] NOT NULL,
[GameId] [int] NULL,
[UTCInserted] [datetime] NOT NULL CONSTRAINT [DF_DG_WORLD_RECORDSII_UTCInserted]  DEFAULT (getutcdate()),
[UTCUpdated] [datetime] NOT NULL CONSTRAINT [DF_DG_WORLD_RECORDSII_UTCUpdated]  DEFAULT (getutcdate()),
[SrvName] [varchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL CONSTRAINT [DF_DG_WORLD_RECORDSII_SrvName]  DEFAULT (@@servername),

CONSTRAINT [PK_DG_WORLD_RECORDS] ПЕРВИЧНЫЙ КЛЮЧ КЛАСТЕР ( [WorldRecordId] ASC ) )

1 Ответ

8 голосов
/ 03 февраля 2012

Не знаю, почему вы пишете этот сумасшедший запрос, но чтобы ответить на ваш вопрос, да, это можно сделать, просто уберите свое назначение из оператора case:

select totaltime = CAST (
   case when exists(
     select * 
     from dg_world_records wr (nolock) 
     where wr.gametypeid = 4 and wr.playerid = 1) 
    then (select min(totaltime) from dg_world_records (nolock) where playerid = 1 and gametypeid = 4)
    else (select max(totaltime) from dg_world_records (nolock) where gametypeid = 4)
    end AS INT)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...