SQL根据状态和计数选择具有特定条件的行

时间:2018-05-14 16:11:53

标签: sql oracle11g sql-server-2012

ID  Foreign_ID  Number   Status_Id
1   101         xyz11    3
2   101         xyz22    3
3   201         xyz33    3
4   201         xyz44    1
5   201         xyz55    7
6   301         xyz66    1
7   301         xyz77    7
8   301         xyz88    7

Status_Id,3表示有效,1表示已取消,7表示已撤销 我想选择只有status_id 1或7且不应有任何活动行的行。该查询应仅返回301(Foreign_ID)行。

4 个答案:

答案 0 :(得分:0)

您可以尝试以下代码:

Select *
From Yourtablename
Where Status_Id in (1, 7)
AND Foreign_ID = 301;

答案 1 :(得分:0)

使用not exists

select * 
from table t
where not exists (
    select 1 from table where Foreign_ID = t.Foreign_ID and Status_Id = 3
);

这称为相关subquery,其中subquery依赖于外部查询,如果外部查询表有3行,则subquery将执行3次。

在您的情况下,子查询具有status_id = 3的过滤器,这意味着它将仅选择status_id = 3的行等等,外部查询具有NOT EXISTS过滤器,这意味着它将选择行status_id <> 3

答案 2 :(得分:0)

我必须承认,也许我还没有完全理解你的要求,  但这应该有效:

SELECT * FROM table WHERE (Status_Id=1 OR Status_Id=7) AND Foreign_ID=301

答案 3 :(得分:0)

抱歉,我仍然无法发表评论。

如果我错了,请更正我,你想查询status_id 1或7,然后在结尾时你说你只想获得foreign_id 301?

SELECT * FROM YOURTABLE WHERE Foreign_ID = 301

这将显示具有Foreign_ID = 301

的行

如果您只想显示Foreign_IDStatus_Id 1或7

SELECT Foreign_ID FROM YOURTABLE WHERE Status_Id IN (1, 7)

或者您的301 Foreign_ID还包含Status_Id 1?对不起,我在你的陈述结束时丢失了,还有你的桌子数据。

如果没有,Aurete的答案将满足您的条件。