在oracle中仅选择且仅选择特定记录[关闭]

Posted

技术标签:

【中文标题】在oracle中仅选择且仅选择特定记录[关闭]【英文标题】:select only and only specific record in oracle [closed] 【发布时间】:2014-05-12 11:43:17 【问题描述】:

我有一张带有卡车和位置的表,每辆卡车可以有许多记录与每个位置: 例如:

truck | location
----------------
60111 | 1
60111 | 2
60111 | 3
60111 | 4
60222 | 1
60222 | 2

....等

我想选择只有 (1,2) 中的位置的卡车。 在我的示例中,返回必须是 60222 ONLY

如何做到这一点? 注意:我想要一个没有硬编码的动态解决方案。

【问题讨论】:

“我不想要硬编码的解决方案”是什么意思? 我的意思是我不想要这样的解决方案:选择卡车的位置在(1,2)而不是(3,4),因为这些数字一直在变化......我想要1, 2 并排除所有其余的 您可以使用排名功能来实现这一点。参考:technet.microsoft.com/en-us/library/ms189798.aspx 【参考方案1】:

类似于 Patrick Hofman 的解决方案是移动 HAVING 子句中的逻辑

SELECT truck
FROM   table
GROUP BY truck
HAVING COUNT(DISTINCT location) = 2
   AND SUM(CASE WHEN location IN (1, 2) THEN 0 ELSE 1 END) = 0

第一个条件返回只有两个不同位置的卡车,不检查它们的值,第二个条件强制这些位置为 1 和 2

【讨论】:

【参考方案2】:

这将选择具有准确位置 1 和 2 的卡车:

select t1.truck
from truck_location t1
where t1.location in (1, 2)
group by truck
having count(distinct t1.location) = 2
   and count(distinct t1.location) = (select count(*) 
                                      from truck_location t2
                                      where t2.truck = t1.truck);

count() 中的distinct 仅在卡车可以分配到同一位置两次时才需要。如果保证卡车/位置组合是唯一的,则无需这样做。

SQLFiddle:http://sqlfiddle.com/#!15/b865f/1

【讨论】:

【参考方案3】:
select distinct truck
from
my_table
where 
truck not in
(
  select distinct truck
  from   my_table
  where  location not in (1, 2)
)

【讨论】:

@a_horse_with_no_name 谢谢 @a_horse_with_no_name 这个查询不会返回只有位置 1 或只有位置 2 的卡车吗? @ypercube:是的,你是对的。【参考方案4】:

您可以按卡车分组,按位置过滤并检查结果为 2:

select truck
from   table
where  location in (1, 2)
group
by     truck
having count(distinct location) = 2

【讨论】:

谢谢,这个对我有用 HAVING 条件不应该是= 2吗? 它对你有用@hamzeh ? 你应该使用having count(distinct location) = 2。但查询也会返回位置为 1,2,3 的卡车 distinct 是必要的如果卡车有两次位置。我发现这比没有区别的>= 2 更明确。但它仍然会返回位置不止 1 和 2 的卡车。

以上是关于在oracle中仅选择且仅选择特定记录[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在时间戳字段中仅使用日期来选择记录?

只在oracle中插入时间[关闭]

在 Oracle 中仅选择没有 Null 值的列

甲骨文:SQL;当且仅当一列更改时选择不同的记录

在 SQL 中仅选择特定字符之后的数字字符

SQL - 在特定条件下从多行中仅选择一个值