【问题标题】:Alternativ to multiple AND conditions in oracleoracle中多个AND条件的替代方案
【发布时间】:2015-09-04 12:12:09
【问题描述】:

我知道有 IN 可以替代多个 OR:

select loginid from customer where code IN ('TEST1','TEST2','TEST3','TEST4'))

这将返回所有登录 ID,其代码与四个 TEST 元素中的任何一个元素匹配。 AND有类似的东西吗?我需要找出所有具有代码的登录ID:TEST10,TESTA,TEST1,TESTB,AIFK,AICK....(有20个代码)

【问题讨论】:

  • 这是否意味着每个 loginid 会有多行,并且您想要所有 20 个值都有行的所有 loginid?
  • where code = 'TEST10' and code 'TESTA' and code = 'TESTB' 有一个简短的版本。这是where 1=0,因为单个列一次不能有多个值。

标签: oracle


【解决方案1】:

你无法比较。使用 OR 或 IN,您可以查找匹配 一个 值的记录。使用 AND 您将查找列与 all 这些值匹配的记录,但该字段当然只能保存 一个 值,因此永远找不到任何记录。

很明显,您正在寻找完全不同的东西。可能您想要聚合您的数据,以查找存在每个值的记录的 ID。这将是:

select loginid 
from customer 
where code IN ('TEST1','TEST2','TEST3','TEST4')
group by loginid
having count(distinct code) = 4;

【讨论】:

  • 这个答案似乎是以下问题的直接克隆:stackoverflow.com/a/15977163/1080648 没有提及用户的特定问题....它没有回答问题
  • @Jon Story:它怎么不回答这个问题?我在解释 code = 'TEST1' AND code = 'TEST2' 没有意义,并详细说明为什么没有。我还可以推导出真正被问到的问题并给出解决方案。不,我没有查找其他答案或复制某些内容。它只是对给定问题的直接查询。
【解决方案2】:

您可以执行以下操作:

SELECT loginid
  FROM customer
 WHERE code IN ('TEST1', ... , 'TEST20')
 GROUP BY loginid
HAVING COUNT(DISTINCT code) = 20;

Jon 的答案和这个的区别在于,如果您使用表中的其他代码,我的查询将返回所有有这 20 个代码行的登录 ID,而乔恩的答案将返回所有有 20 行的登录 ID不同的代码。

【讨论】:

  • 如您所见,这并不能回答问题
  • 有时候一个问题从字面上看是没有意义的,但可以推断出实际意图,并回答这不是没有道理的。当然,正如您在“但是”部分所做的那样。我不确定在这种情况下是否有任何其他解释。
  • 但是为什么每个客户会有 10 行呢?每个顾客肯定有一排吗?或者我从数据库设计中假设了太多常识......
  • 在我的脑海中,也许 pk 是 loginid 和 code?​​span>
【解决方案3】:

没有

一个简短的答案,我知道,但有时它是唯一真正的答案。

然而

根据您想要实现的具体目标,您可以使用对项目进行分组的查询计数来检查是否全部匹配。

这假设您的 CustomerCodes 保存在单独的关系表中。

SELECT loginID
FROM Customer
WHERE loginID IN (
    SELECT loginID, count(*) as codeCount
    FROM CustomerCodes
    GROUP BY loginID
    HAVING codeCount = 20
)

如果您有 Code1、Code2 Code3 等字段,则不起作用...您必须将数据拆分到单独的表中,例如:

loginID | code
---------------
1       | code1
1       | code2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    相关资源
    最近更新 更多