【问题标题】:Filtering the records [closed]过滤记录[关闭]
【发布时间】:2015-02-13 06:09:52
【问题描述】:

假设我有一个包含 Country 、 state 和其他列的表 WORLD。 我需要过滤这样的记录

  • Country = 'USA' and STATE = 'LA'(美国所有其他州都应该来)和
  • Country = 'CANADA' and state = 'ALBERTA'(加拿大所有其他州都应该来)和

  • 我不想要任何带有country = 'GERMANY' 的记录(德国的任何州都不应该出现)

不应获取所有这些记录。

你能给我查询吗?

【问题讨论】:

  • 请考虑参加常规的 SQL 学习课程,因为您所要求的实际上是最基础的 SQL。这样的课程还将帮助您以准确的方式陈述您的 SO 问题,它将帮助您了解您需要问什么。

标签: sql oracle


【解决方案1】:

我认为这里的棘手部分是找到如何表达WHERE 子句符合某些标准。

你可以使用De Morgan's laws:

"not (A and B)" 等同于"(not A) or (not B)"

"not (A or B)""(not A) and (not B)" 相同。

所以

... WHERE (Country = 'USA' and STATE = 'LA') 
          OR (Country = 'CANADA' and state = 'ALBERTA')
          OR (country = 'GERMANY')

... WHERE (Country <> 'USA' or STATE <> 'LA') 
          AND (Country <> 'CANADA' or state <> 'ALBERTA')
          AND (country <> 'GERMANY')

如果您想使用关系代数解决这个问题,您可能正在寻找antijoin。这在 Oracle 中使用NOT IN 运算符表示(参见Oracle's documentation):

SELECT ....
WHERE theID NOT IN (SELECT theID WHERE (Country = 'USA' and STATE = 'LA') 
          OR (Country = 'CANADA' and state = 'ALBERTA')
          OR (country = 'GERMANY'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 2021-09-19
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多