编写具有更改常量的Oracle查询

时间:2014-01-15 17:58:49

标签: sql oracle

我正在尝试编写一个Oracle查询,该查询将填充不在数据库中的一组数据中的缺失字段。

也就是说,我将拥有数据

+----+-----+-----+
|Name|Name2|Name3|
+----+-----+-----+
|A   |1    |     |
+----+-----+-----+
|B   |1    |     |
+----+-----+-----+
|C   |2    |     |
+----+-----+-----+
|Z   |39   |     |
+----+-----+-----+
|... |...  |...  |
+----+-----+-----+
|... |...  |...  |
+----+-----+-----+
|... |...  |...  |
+----+-----+-----+
|QF  |893  |     |
+----+-----+-----+

名称是唯一的,而不是在数据库中。

Name2不是唯一的,并且存在于数据库内部和外部。

Name3是未知的,并且需要,而不是唯一的,由Name2定义(Name2和Name3之间的映射是一对一的),并且在数据库中。

sql中的单个查询可以像这样建模,

SELECT MY_TABLE.Name3 FROM MY_TABLE WHERE MY_TABLE.Name2='1'

我知道将查询返回的内容放入我的数据的前两行。

然后我可以为剩余的行重复它

SELECT MY_TABLE.Name3 FROM MY_TABLE WHERE MY_TABLE.Name2='2'

虽然这需要我编写并运行数千个单独的select语句,并复制语句返回的内容但是Name2重复多次。

有没有办法编写单个select语句来填充我缺少的列,请记住列名不在数据库中,编写查询所花费的时间无关紧要?

理想的查询就是这样的,

SELECT Name, MY_TABLE.Name2, MY_TABLE.Name3 FROM MY_TABLE WHERE 
   (MAGICALLY_SET Name = 'A' AND
    Name2 = '1') OR
   (MAGICALLY_SET Name = 'B' AND
    Name2 = '1') OR
   (MAGICALLY_SET Name = 'C' AND
    Name2 = '2')
   ...
   (MAGICALLY_SET Name = 'QF' AND
    Name2 = '893');

这将返回已经很好设置的数据。

+----+-----+-----------------+
|Name|Name2|Name3            |
+----+-----+-----------------+
|A   |1    |returned_value1  |
+----+-----+-----------------+
|B   |1    |returned_value1  |
+----+-----+-----------------+
|C   |2    |returned_value54 |
+----+-----+-----------------+
|Z   |39   |returned_value87 |
+----+-----+-----------------+
|... |...  |...              |
+----+-----+-----------------+
|... |...  |...              |
+----+-----+-----------------+
|... |...  |...              |
+----+-----+-----------------+
|QF  |893  |returned_value439|
+----+-----+-----------------+

我尝试编写用于更改常量Name值的select语句,并使用dual,但我不相信我在正确的轨道上。

如果Name在表中,我知道我可以为此编写查询。但是没有能力制作新表,并插入所有Name / Name2数据。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我最终得到了一个不太理想的解决方案,

SELECT 'A' AS Name, Name2, Name3 FROM MY_TABLE WHERE NAME2 = '1' UNION ALL
SELECT 'B' AS Name, Name2, Name3 FROM MY_TABLE WHERE NAME2 = '1' UNION ALL
SELECT 'C' AS Name, Name2, Name3 FROM MY_TABLE WHERE NAME2 = '2' UNION ALL
...

哪个可以包含在一个select * from中,但它输出正确,

Name, Name2, Name3
A     1      returned_value1
B     1      returned_value1
C     2      returned_value54
...