2017-04-06 30 views
0

我在我的ColorAssign表中有以下数据;如何在没有UNION的情况下通过SQL中的不同条件从同一表中获取数据?

| PKID | Name | Type | HasAssigned | 
| 11 | Red  | 1 | True  | 
| 12 | Blue | 2 | False  | 
| 13 | Yellow | 3 | False  | 
| 14 | Red1 | 1 | False  | 
| 15 | Yellow1 | 3 | True  | 
| 16 | Blue1 | 2 | False  | 

注意,在这个表中我有颜色类型的类型字段和assignstatus在HasAssigned字段还与不同的名称不同的主密钥(可以是相同的名称 - 但类型是找到的实际颜色的标识符)。

我的目标是获取数据的条件: - 查找与Hasassigned =真色彩类型,或者该类型中没有记录有真实的记录。然后键入Hasassigned = false的颜色类型。所以我的结果是;

| 11 | Red  | 1 | True  | 
    | 12 | Blue | 2 | False  | 
    | 15 | Yellow1 | 3 | True  | 
    | 16 | Blue1 | 2 | False  | 

这对UNION来说可能是通过编写两个查询,我们可以用一个查询来做到这一点。寻找其他优化的方式?

+2

这是MySQL或SQL服务器? –

+1

您的病情描述不清楚。但是,如果我理解正确,则需要为每个Type使用HasAssigned = true的颜色,或者如果Type的任何一行没有为true,则HasAssigned = false。那是对的吗? –

+0

是斯隆,我会更新我的问题的条件。 – pvaju896

回答

1

在SQL-Server,您可以使用以下查询:

SELECT PKID, Name, Type, HasAssigned 
FROM (
    SELECT PKID, Name, Type, HasAssigned, 
      RANK() OVER (PARTITION BY Type 
         ORDER BY CASE WHEN HasAssigned='True' THEN 1 ELSE 2 END) AS rnk 
    FROM ColorAssign) AS t 
WHERE t.rnk = 1 

Demo here

+0

我们可以得到使用结合或什么的,我希望这将更加优化,然后子查询...... – pvaju896

+0

@ pvaju896你给我的查询尝试其他方法同样的结果?使用窗口函数来确定优先级通常是最有效的方法。 –

+0

是的,我试图完美的工作。但我只是想知道是否有其他方式。 – pvaju896

1

如果你正在使用MySQL,以下应该产生你要的结果:

SELECT 
    `PKID`, 
    `Name`, 
    `Type`, 
    `HasAssigned` 
FROM `ColorAssign` 
GROUP BY `Type` 
ORDER BY `HasAssigned` DESC; 
+0

这对我来说不起作用,通过在MSSQL查询中一起工作并按组进行排序。 – pvaju896

-1

如果我没有理解你的要求,在WHERE子句中的OR语句会做你想要什么:

WHERE (
     (Type = @Type AND HasAssigned = True) 
     OR 
     HasAssigned = False 
     ) 
+0

这不会做OP的想法。 –

+0

我不会传递类型之类的参数,需要通过查询查找所有类型的记录 – pvaju896

0

我只是想通过这种方式,我可以得到的结果;

select * from ColorAssign ci where 
(ci.HasAssigned = 'True' 
OR 
NOT EXISTS(select 1 from ColorAssign sc where sc.Type = ci.Type AND sc.HasAssigned = 'True') 
) 
相关问题