选择在多个列上具有多个条件的语句

时间:2013-08-14 09:45:12

标签: sql oracle

我的表格的一部分如下,

Key|Value
---------
 A | V1
 B | V2
 C | V3

我知道以下查询肯定不会返回任何结果,但是获得肯定结果的正确查询是什么,即'1'。

我的意思是我应该应用什么查询来检查A的值为V1而B的值为V2,然后返回'1'。 如果A或B的结果不同,新查询将无法返回任何内容。

将表格视为键/值对的映射。唯一不同的是它不是Java地图而是Oracle Db中的表。那么,如何实现满足键/值对的结果。

select 1 from myTable 
where (key = 'A' and value = 'V1') 
  AND (key = 'B' and value = 'V2');

如果表格的设计本身需要一些改变,请告诉我。

3 个答案:

答案 0 :(得分:2)

我认为这就是你想要的。

select 1 from dual
 where exists(
              select 1
                from mytable
               where key = 'A' and value = 'V1')
   and exists(
              select 1
                from mytable
               where key = 'B' and value = 'V2')

答案 1 :(得分:1)

使用我的心灵调试能力:

如果符合以下条件,您希望值为1

  1. 有一行Key =“A”且value =“V1”AND
  2. 还有另一行Key =“B”和value =“V2”
  3. 要像你需要的那样获得一行:

    select 1 from myTable where key = 'A' and value = 'V1'
    

    获得像你需要的第二行

    select 1 from myTable where key = 'B' and value = 'V2'
    

    现在你需要确保这两行都存在。

    听起来并不简单,因为SQL检查单行上的所有where条件,因此语句如下:

    select 1 from myTable where key = 'A' and key = 'B'
    

    是荒谬的,因为它要求键列同时具有两个不同的值。

    一个(低效)解决方案是将表连接到自身

    select 1 
    from mytable t1
      cross join mytable t2
    where t1.Key = 'A' and t1.Value='V1'
      and t2.Key = 'B' and t2.Value='V2'
    

    这将生成表格的笛卡尔积,将每一行与每一行连接起来。它会生成

    t1.Key|t1.Value|t2.Key|t2.Value
    -------------------------------
     A    | V1     |  A    |  V1
     B    | V2     |  A    |  V1
     C    | V3     |  A    |  V1
     A    | V1     |  B    |  V2   <-- the row you need
     B    | V2     |  B    |  V2   
     C    | V3     |  B    |  V2   
     A    | V1     |  C    |  V3   
     B    | V2     |  C    |  V3   
     C    | V3     |  C    |  V3   
    

    将使您能够同时检查原始表的两行。

    请注意,这会生成一个包含^ ^ 2行的表格,因此如果表格有多行,或者如果您需要, 请勿使用 同时检查两行以上。

答案 2 :(得分:0)

如果您只想检查是否有符合某些条件的行,您可以使用以下构造

select count(*) from dual
where exists (
               select 1  
               from myTable 
               where (key = 'A' and value = 'V1')                       
              )
 AND exists (
               select 1  
               from myTable 
               where (key = 'B' and value = 'V2')                       
              );