我的表格的一部分如下,
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');
如果表格的设计本身需要一些改变,请告诉我。
答案 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
要像你需要的那样获得一行:
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')
);