ELLO!
我试图用“' w'”' e'选择一行。或者' s'和一个独特的GUID。 ' E'具有最高优先级,因此当GUID包含应该选择该行时。 ' W'第二高的优先级,所以当没有其他的优先权时。 ' W'应该被选中。连同整个行数据。
我尝试使用以下代码:
SELECT * FROM TABLENAME
WHERE GUID IN (SELECT DISTINCT GUID FROM TABLENAME )
AND (CATEGORY='S' OR CATEGORY='E' OR CATEGORY='W')
无论如何,我怎么能做我所描述的事情?我一直在尝试使用不同的方法来使用不同的方法,但它仍然为每个GUID提供了不止一行。
分组byn还没有工作。因为我在添加它时收到错误。
答案 0 :(得分:4)
select guid, min(priority) from
(SELECT *,
case when category = 'E' then 1
when category = 'W' then 2
when category = 'S' then 3
end as priority
FROM TABLENAME
WHERE CATEGORY in ('S','E','W') ) a
内部查询根据问题为category
列分配优先级。在外部查询中,您可以从具有最高优先级的任何类别中进行选择。还要在外部select
中包含您需要的所有其他列。
修改:上述方法并不健全,因为您无法使用计算出的priority
列来选择每个guid对应的类别。
因此,另一种方法是使用union
。
SELECT * FROM TABLENAME
WHERE CATEGORY = 'E'
union
SELECT * FROM TABLENAME
WHERE CATEGORY = 'W'
and guid not in (select guid from tablename where category ='E')
union
SELECT * FROM TABLENAME
WHERE CATEGORY = 'S'
and guid not in(select guid from tablename where category in ('E','W'))
第一个查询选择类别为E
的所有行。第二个查询选择其类别为W
并且之前未选择其guid的所有行。第三个查询选择所有类别为S
并且在前两个查询中未选择其guid的行。
UNION
所有查询都应该为您提供所需的结果。
尝试使用虚拟数据的SQL小提琴。 http://sqlfiddle.com/#!9/07c0d/1
答案 1 :(得分:0)
一种方法是为每个guid获取适当的类别,然后再返回join
。另一个是union all
系列。后者可能更有效率,因为您没有很多选项来确定优先级:
select t.*
from tablename t
where category = 'e'
union all
select t.*
from tablename t
where category = 'w' and
not exists (select 1 from tablename t2
where t2.category in ('e') and t2.guid = t.guid
)
union all
select t.*
from tablename t
where category = 's' and
not exists (select 1 from tablename t2
where t2.category in ('e', 'w') and t2.guid = t.guid
) ;
为了提高性能,您需要category
和guid, category
上的索引。