簡體   English   中英

SQL選擇value ='X'或min值的位置

[英]SQL Select where value = 'X' or min value

我有一個龐大的客戶數據庫,客戶表中有人和他們與組織的關系。 人們可能屬於多個組織( 這允許組織內的部門 )。 具有多個組織的人員必須具有默認組織,這通常在isDefault = T確定,但是前端應用程序還可以通過選擇MIN(RowID)來確定默認應用程序isDefault = F

因此在下表中我們知道PersonId 3的默認OrgID11 (IsDefault = T)但是,我需要找出查找PersonID 12默認值的查詢。

Select orgId as default from myTable
where personID = 12
and isDefault = 'T'

如果返回0行,則執行如下查詢:

Select orgId as default from myTable
where personID = 12
and 
RowId in (select Min(rowId) 
from myTable 
where PersonId = 12)


RowID | PersonID  | OrgId  |  isDefault
1     |    12     |   14   |     F
2     |    12     |   17   |     F
3     |    3      |   11   |     T
4     |    3      |   14   |     F

我想你可以通過兩次訂購得到你想要的東西,首先是IsDefault是T還是F,然后是RowId,並取得最佳結果:

SELECT TOP 1 OrgId as [Default]
FROM MyTable
WHERE PersonId = 12
ORDER BY
    CASE WHEN IsDefault = 'T' THEN 0 ELSE 1 END,
    RowId

在MySql服務器中,您可以使用限制1進行聯合:

SELECT OrgId AS `default`
FROM (
    SELECT OrgId FROM MyTable
    WHERE PersonID = 12
    and isDefault = 'T'

    UNION

    SELECT OrgId FROM MyTable
    WHERE PersonId = 12
    AND RowId in (
        SELECT MIN(RowId)
        FROM MyTable
        WHERE PersonId = 12
    )
) SomeName LIMIT 1;

對於SQL Server:

SELECT TOP 1 OrgId AS [default]
FROM (
    SELECT OrgId FROM MyTable
    WHERE PersonID = 12
    and isDefault = 'T'

    UNION

    SELECT OrgId FROM MyTable
    WHERE PersonId = 12
    AND RowId in (
        SELECT MIN(RowId)
        FROM MyTable
        WHERE PersonId = 12
    )
) SomeName;

沒試過執行這個但是期望這應該有效。 IsDefault會使子查詢短路。

  Select orgId as default from myTable o
   where personID = 12 
       and  
       ( IsDefault = 'T' OR
                   RowId = (select Min(rowId)  
                               from myTable i
                             where i.PersonId = o.PersonId
                           )  
        )

將此邏輯放入一個查詢中相當復雜。 您必須將所有結果合並在一起,跟蹤結果的來源。 然后,您必須計算來自第一部分的行數,並僅保留適當結果集中的行。

select orgid, mytable
from (select t.*, sum(which) over (partition by null) as whichcnt
      from ((Select 1 as which, orgId as default
             from myTable
             where personID = 12 and
                   isDefault = 'T'
            )
            union all
           (Select 0 as which, orgId as default
            from myTable
            where personID = 12 and 
                  RowId in (select Min(rowId) from myTable where PersonId = 12)
           )
          ) t
     ) t
where whichcnt > 0 and which = 1 or whichcnt = 0

如果您可以使用TSQL而不是單個查詢,那么您可以只運行第一個版本,檢查結果中的行數,然后確定要采用的結果集。

請試試這個

select PersonID ,OrgID from mytable where isDefault='T'
union all

select personID,min(OrgID) [default]
from myTable P
where  not exists 
(select * from mytable C where P.PersonID=C.PersonID and C.isDefault='T')
group by personID

這取決於表的大小是什么索引。如果說rowid有唯一的聚簇索引和personid,並且isdefault有一個nc索引我將使用兩個statemnts。

 declare @orgid int = null
 select @orgid =orgid from table where personid = 12 and isdefault = 'T'
 if (orgid  is null)
 begin
 select @orgid = orgid 
 from mytable
 where rowid = (
 select min(rowid)from table where personid = 12 and isdefault = 'F'
 )
 end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM