我试图从“第一”行满足某些标准,其中“第一”是由一个硬编码的列表中定义的提取列值列值。不幸的是,我是一名SQL业余爱好者。我正在使用DB2。从列值的硬编码列表(枢轴问题?)找到的第一行
我能做到这一点低效这样的:
SELECT COALESCE(
(SELECT COL FROM SOMETABLE WHERE X = "txt1" AND Y = "txt2" AND COL = 'A'),
(SELECT COL FROM SOMETABLE WHERE X = "txt1" AND Y = "txt2" AND COL = 'B'),
(SELECT COL FROM SOMETABLE WHERE X = "txt1" AND Y = "txt2" AND COL = 'C'),
(SELECT COL FROM SOMETABLE WHERE X = "txt1" AND Y = "txt2" AND COL = 'D')
)
这里的问题是,SOMETABLE是非常大的。所以不是我想这样做:
SELECT COALESCE(
(SELECT COL FROM T WHERE COL = 'A'),
(SELECT COL FROM T WHERE COL = 'B'),
(SELECT COL FROM T WHERE COL = 'C'),
(SELECT COL FROM T WHERE COL = 'D')
)
FROM
(SELECT COL FROM SOMETABLE WHERE X = "txt1" AND Y = "txt2") AS T
这是无效的,因为我不能引用的T台。
假设高于T包含下列行:
'E'
'B'
'D'
然后我想挑“B”,因为它是在COALESCE语句中指定的第一个值。
我知道我可以做这样的事情得到一定程度接近我想要的东西:
SELECT
(CASE COL WHEN 'A' THEN COL ELSE NULL END),
(CASE COL WHEN 'B' THEN COL ELSE NULL END),
(CASE COL WHEN 'C' THEN COL ELSE NULL END),
(CASE COL WHEN 'D' THEN COL ELSE NULL END)
FROM
(SELECT COL FROM SOMETABLE WHERE X = "txt1" AND Y = "txt2") AS T
这样产生的结果是:
- - - - - - - D - B - -
现在我想聚集或“扁平化”到这个单排,像这样:
- B - D
然后,我会简单地凝聚在列。
任何建议,将不胜感激!
对,这样会更好。不幸的是,似乎在我查询的Db2/400系统上不支持“with”语句。 – Einar 2009-12-08 11:06:01
对不起,在DB2v9.1中支持(我曾经使用过的一个 ) – 2009-12-08 16:09:13