简体   繁体   English

复杂的SQL查询请求

[英]Complicated SQL query request

I have a table 我有桌子

Number    Letter    KeyLetter

1         a         1
1         b         0
1         c         0
1         d         0

2         e         0
2         f         0
2         g         0

3         h         1
3         i         1
3         j         0

From it I want this: 从它我想要这个:

Number    Letter    KeyLetter

1         a         1

2         e         0
2         f         0
2         g         0

3         h         1
3         i         1

For each set of numbers, if a letter is a KeyLetter, I want to ignore any non KeyLetters. 对于每组数字,如果字母是一个KeyLetter,我想忽略所有非KeyLetter。 If a set of numbers doesn't have an entry where the letter is a KeyLetter, then show all of the entries in that set of numbers. 如果一组数字中没有字母是KeyLetter的条目,则显示该组数字中的所有条目。

What SQL query would be able to do this? 什么SQL查询将能够做到这一点?

Simple answer, return the rows with KeyLetter = 1, and also those with a Number not having a KeyLetter = 1. 简单的答案,返回KeyLetter = 1的行,以及Number不具有KeyLetter = 1的行。

select *
from tablename t1
where t1.KeyLetter = 1
   or not exists (select * from tablename t2
                  where t1.Number = t2.Number
                    and t2.KeyLetter = 1)

Alternatively: 或者:

select t1.*
from tablename t1
join (select Number, max(KeyLetter) maxKeyLetter
      from tablename
      group by Number) t2
  on t1.Number = t2.Number and t1.KeyLetter = t2.maxKeyLetter

Or... 要么...

select *
from tablename
where (Number, KeyLetter) in 
    (select Number, max(KeyLetter)
     from tablename
     group by Number)

The first two are Core ANSI SQL compliant. 前两个符合Core ANSI SQL。 The latter one uses extension F641, "Row and table constructors". 后者使用扩展F641,“行和表的构造函数”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM