我在Oracle for Oracle 10g中有一个家庭作业,我必须将union应用于两个不同的select语句,以返回两列。我需要在vendor_state下的每个单元格的值来指示CA和另一个状态中的每个其他值返回“Outside CA”,以表明它们在其他地方。
我应用了union并生成了两列和CA的列表,但列出了许多其他状态ID,我找不到有关如何更改查询本身中的实际值的说明。最后,我偶然发现了答案,但我无法解释为什么会这样。代码如下:
SELECT vendor_name,
vendor_state
FROM vendors
WHERE vendor_state IN 'CA'
UNION
SELECT vendor_name,
'Outside CA' AS vendor_state
FROM vendors
WHERE vendor_state NOT IN 'CA'
ORDER BY vendor_name
这给了我我需要的确切答案,但我不知道为什么第二个select语句中的别名可以这样表现......我的教科书中没有给出任何解释,我读过的任何内容都没有说明该列别名可以像这样完成。但是,通过切换列名和别名值,我已经替换了返回的值而不是列名本身...我不是在抱怨结果,但如果我知道我是怎么做的话会有所帮助。 / p>
答案 0 :(得分:5)
诀窍是:
在第一个SELECT中,“vendor_state”是表中字段本身的值。而且,由于WHERE子句,您将只有'CA'
在第二个SELECT中,“vendor_state”不是数据库字段中的值。相反,它仅仅是字面值“外部CA”的别名
因为两个名字都匹配(根据UNION的要求),你的最终结果“看起来像”所有的值来自同一个地方,实际上他们没有。
也许这会更好:
SELECT vendor_name, vendor_state, vendor_state AS vendor_state_new
FROM vendors
WHERE vendor_state IN 'CA'
UNION
SELECT vendor_name, vendor_state, 'Outside CA' AS vendor_state_new
FROM vendors
WHERE vendor_state NOT IN 'CA'
ORDER BY vendor_name
现在,对于这两个查询,vendor_state
显示数据库值。并且calculated_state
显示第一个SELECT的数据库值,以及第二个的“外部CA”。
在您的查询中,vendor_state
扮演我vendor_state_new
的角色:显示第一个数据库值,第二个计算值。并且AS
在第一个SELECT中被省略,因为vendor_state AS vendor_state
将是多余的(但是它可以用于澄清目的,并且当你将计算的和“原始”值混合在一起时这是一个很好的习惯。给了colum name)