【问题标题】:SQL query - Selecting distinct values from a tableSQL 查询 - 从表中选择不同的值
【发布时间】:2013-01-26 19:29:27
【问题描述】:

我有一张表,其中有多个针对 FK 的条目。我想找出没有某些条目的 FK 的值,例如
我的表有以下条目。

PK----------------FK-----------------列条目 1----------------100----------------ab1 2----------------100-----------------ab2 3----------------100-----------------ab4 4----------------200-----------------ab1 5----------------200-----------------ab2 6----------------200-----------------ab3 7----------------300-----------------ab1 8----------------300-----------------ab2 9----------------300-----------------ab3 10---------------300------ab4

现在,我想从这个表中过滤掉所有没有 ab3 或 ab4 的 FK。当然,我期望不同的值,即在这种情况下,结果将是 FK= 100 和 200。
我正在使用的查询是

select distinct(FK) 
from table1 
where column_entries != 'ab3' 
   or column_entries != 'ab4';

当然,此查询未获取所需的结果。

【问题讨论】:

  • 你得到了什么结果,它与预期有何不同?
  • @StilesCrisis 我得到的结果是 FK=100, 200,300。这是因为 300 的第一行没有 ab3 或 ab4。
  • 每条记录都满足条件,因为您使用了or'ab3' != 'ab3' or 'ab3' != 'ab4''ab4' != 'ab3' or 'ab4' != 'ab4' 产生真值。使用and,或者为了更清楚地表达意图,使用not in(但比较列表不能包含null)。
  • @NikolaMarkovinović 我也尝试过,没有带来我想要的结果,即 FK = 100, 200。它仍然带来 300。
  • 傻我。 Ab1 和 Ab2 满足条件。您需要选择具有ab3或ab4的fk,并使用外连接排除它们或不存在。

标签: sql oracle


【解决方案1】:

尝试以下方法:-

select distinct fk_col from table1
minus
(select distinct fk_col from table1 where col_entry='ab3'
intersect
select distinct fk_col from table1 where col_entry='ab4')

这将显示所有没有“ab3”和“ab4”的 FK。即在您的情况下为 100 和 200

【讨论】:

  • +1,尽管distinct 可能不是必需的。我不确定,但我认为minusintersect 都暗示了这一点。
【解决方案2】:

如果我以正确的方式提出您的问题,以下脚本可能是解决方案。

SELECT DISTINCT(TableForeignKey)
FROM Test
WHERE TableForeignKey NOT IN (
SELECT T1.TableForeignKey
FROM Test T1 INNER JOIN Test T2 ON T1.TableForeignKey = T2.TableForeignKey
WHERE T1.TableEntry = 'ab3' AND T2.TableEntry = 'ab4')

SQLFiddle Demo

【讨论】:

    【解决方案3】:

    您可以在 HAVING 中将 GROUP BY 与条件聚合一起使用:

    SELECT FK
    FROM table1
    GROUP BY FK
    HAVING COUNT(CASE column_entries WHEN 'ab3' THEN 1 END) = 0
        OR COUNT(CASE column_entries WHEN 'ab4' THEN 1 END) = 0
    ;
    

    这两个条件聚合分别计算 'ab3''ab4' 条目。如果两者的结果都大于 0,则对应的 FK 同时具有 'ab3''ab4',因此不会返回。如果至少有一个计数为 0,则认为 FK 满足要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      相关资源
      最近更新 更多