首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Noob SQL问题--需要在一行上提取哪个条件为TRUE,但在另一行上从不为FALSE。

Noob SQL问题--需要在一行上提取哪个条件为TRUE,但在另一行上从不为FALSE。
EN

Database Administration用户
提问于 2022-05-12 14:03:52
回答 3查看 27关注 0票数 0

我在查询合同数据,其中客户的合同被命名和恢复。表中的每一行都有每个合同的客户ID、生效日期和期限日期,因此,如果客户已经恢复合同,客户可以多次出现。我只想让客户出现在一个期限日期,而没有一个新的行与有效的合同。

我现在要做的是:选择所有具有术语日期保存的客户端到电子表格中,选择所有显示活动保存到电子表格中的客户端。

V查找移除在活动电子表格中也出现的所谓客户端。我知道一定有更好的方法。

EN

回答 3

Database Administration用户

发布于 2022-05-12 15:37:43

我想你想要这样的东西:

代码语言:javascript
复制
select                        -- show 
    c.Client_ID, 
    c.Effective_Date, 
    c.Term_Date
from                          -- all contracts
    contracts as c
where                         -- from clients
    not exists                -- without
    ( select 1 
      from contracts as ac    -- active contracts
      where ac.Term_Date is null
        and ac.Client_ID = c.Client_ID
    ) ;
票数 0
EN

Database Administration用户

发布于 2022-05-13 02:04:18

它可能不是一个优雅的解决方案,但您可以在每个分区中使用两个selects和一个ROW_NUMBER()函数,每个分区都是按操作日期排序的。一个查询将恢复,另一个查询将恢复。然后加入client = client和ROW_NUMBER() = ROW_NUMBER()上的两个查询。在第二个查询中有空的是当前活动的客户端。

编辑:在这里扭转我的想法。对不起,误解了你的需要。

票数 0
EN

Database Administration用户

发布于 2022-05-13 04:05:29

我推荐这种模式设计模式。我把它叫做历史+电流。

历史表包含每个客户端的许多行;每个合同包含一行。当前表只包含关于每个客户端的“当前”信息--每个客户端一行。您的选择可能只需要此表。

您的设计是“正确的”,因为当前的合同没有冗余地存储在两个地方。我的设计要求在更改两个表时都进行更改。在添加下一个合同时,这是一个小的额外成本,但对SELECT来说是一个很大的收益。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/312044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档