【问题标题】:SQL select rows with only a certain value in themSQL 选择其中只有特定值的行
【发布时间】:2021-12-11 03:42:09
【问题描述】:

我有一张这样的桌子

Col 1 Col 2 Col 3
1       A     1
2       A     2
3       B     1
4       C     1
5       C     2
6       D     1

我如何只获得 Col 3 = 1 的 唯一 行?

我想获得第 3 行和第 6 行(Col 2 = B 和 D 分别)。我不想要 A 或 C,因为它们也有 Col 3 = 2。

我已经尝试了一些类似的方法:

select col 2 from table group by col 2 having count(col 3) = 1

但这只会显示 Col 2 的结果,所以我不确定 Col 3 的内容是否 = 1。

编辑:对不起,伙计们,也许我没有清楚地表达我的问题。我想获取 Col 2 的所有行,其中仅包含 Col 3 = 1 AND ONLY 1

因此,如果我尝试 WHERE Col 3= 1,它将返回 4 行,因为 A 有 1。但由于 A 也有一行 Col 3 = 2,所以我不希望这样,对于 C。从这个示例表中,我希望最终结果只显示 2 行,B 和 D。

我的示例表就是一个例子,我实际上有大约 5000 行要过滤,否则我会按照你们的建议做:)

【问题讨论】:

  • 从 col3=1 的表中选择 *
  • 是时候看一篇sql教程了:w3schools.com/sql/default.asp
  • 对不起,伙计们,这并不像看起来那么简单。除非我遗漏了 AllisonC 从 SQL 查询中推断出的东西。
  • 几分钟后更改整个问题是不好的,这会使大多数答案出错。最好问新的。
  • 我没有改变我的问题,但似乎我最初是以人们误解他们的答案的方式编写的,所以我需要添加说明。如果这给您带来了问题,我深表歉意。

标签: sql tsql select filter


【解决方案1】:
SELECT col2
FROM your_table
GROUP BY col2
HAVING MAX(col3) = 1 AND MIN(Col3) = 1

或者

SELECT a.col2 
FROM your_table a
WHERE a.col3=1 AND NOT EXISTS(SELECT *
                              FROM your_table b 
                              WHERE a.col2=b.col2 AND b.col3<>1)

【讨论】:

  • 你也可以HAVING AVG(col3) = 1
  • 第二个最后应该是b.col3 &lt;&gt; 1吗?
  • @322896 是的,已修复。谢谢。
  • 谢谢你的精彩回答,顺便说一句!
【解决方案2】:
SELECT * FROM #temp t1
WHERE EXISTS 
(
select Col2 from #Temp t2 
WHERE t2.Col2 = t1.Col2
group by col2 
having count(col3) = 1
)

使用 MS SQL2008 和以下测试(所以如果我的答案不正确,它可能会阻止其他人测试他们的...):

CREATE TABLE #temp 
( 
    Col1 INT, 
    Col2 CHAR(1),
    Col3 INT
)

INSERT INTO #Temp    
    (Col1, Col2, Col3)
SELECT    1,'A',1
UNION
SELECT    2,'A',2
UNION
SELECT  3,'B', 1
UNION 
SELECT 4,'C',1
UNION 
SELECT 5,'C',2
UNION 
SELECT 6,'D',1

SELECT * FROM #temp t1
WHERE EXISTS 
(
select Col2 from #temp t2 
WHERE t2.Col2 = t1.Col2
group by col2 
having count(col3) = 1
)

DROP TABLE #temp

【讨论】:

    【解决方案3】:

    很难确切地知道你想要得到什么,但这是我最好的猜测:

    SELECT * FROM theTable WHERE col2 NOT IN
      (SELECT col2 FROM theTable WHERE col3 <> 1)
    

    【讨论】:

      【解决方案4】:
      ;with T ([Col 1], [Col 2], [Col 3]) as
      (
      select 1,       'A',     1 union all
      select 2,       'A',     2 union all
      select 3,       'B',     1 union all
      select 4,       'C',     1 union all
      select 5,       'C',     2 union all
      select 6,       'D',     1
      )
      
      
      select *
      from T
        left outer join 
          (
            select distinct [Col 2] 
            from T
            where [Col 3] <> 1
          ) as T2
        on T.[Col 2] = T2.[Col 2]
      where T.[Col 3] = 1 and
            T2.[Col 2] is null
      

      【讨论】:

        【解决方案5】:

        您可能正在寻找的是WHERE 子句。

        SELECT * FROM YouTable WHERE col3 = 1 AND col2 in ('B','D');
        

        【讨论】:

          猜你喜欢
          • 2016-10-12
          • 2020-12-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-06
          • 2014-11-28
          • 1970-01-01
          • 2012-03-10
          相关资源
          最近更新 更多