在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中仅选择且仅选择特定记录[关闭]的主要内容,如果未能解决你的问题,请参考以下文章