我正在尝试编写一个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数据。
有什么想法吗?
答案 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
...