【问题标题】:SELECT/NOT EXISTS unique records with a 'condition' [duplicate]选择/不存在具有“条件”的唯一记录 [重复]
【发布时间】:2015-07-20 17:04:40
【问题描述】:

我的表只包含 2 列 IDproduct,如下所示:

ID      Product
----------------- 
1       microsoft
0       cisco
2       cisco
7       cisco
3       vmware
0       adobe
0       microsoft

我需要编写一个仅列出 id=0 记录的查询,

ID      Product
---------------
0       adobe 

不想列出的原因

ID      Product
----------------
0       micrsoft
0       cisco 

是因为他们有一个或多个具有产品 ID 的记录。

试过这个:

SELECT 
    [ProductID], [Product]
FROM [table] AS t1
WHERE ProductID = 0
    AND NOT EXISTS (SELECT 1
                    FROM [table] AS t2
                    WHERE t1.ProductID = t2.ProductID
                      AND t2.ProductID <> 0)

似乎需要很长时间才能查询。 (表有 2 000 000 条记录)

【问题讨论】:

标签: sql sql-server tsql unique where-clause


【解决方案1】:

使用简单的group byhaving 子句:

select 0 as id, product
from [table] t
group by product
having min(id) = 0 and max(id) = 0;

【讨论】:

  • 这行得通。谢谢:D
  • 如果我要从同一个表中选择 3 个其他列,是否可以将其包含在查询中?
  • @vardha 。 . .您可以使用聚合函数来选择它们。 . . min(col1), . . ..
【解决方案2】:

您只需要加入 Product 而不是 ProductID:

SELECT  [ProductID],[Product]
FROM   [table] as t1 
where ProductID=0 
AND NOT EXISTS (
  SELECT 1 FROM [table] AS t2 
  where  t1.Product=t2.Product 
  AND t2.ProductID<>0
)

这转换为“不存在产品具有相同名称且 ID 不是 0 的其他行”。

【讨论】:

  • 除了使用 2 个 select 语句还有其他更简单的方法吗?
  • 不容易,不。您也可以使用自联接来执行此操作,但这可能会更慢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 2023-01-18
相关资源
最近更新 更多