我有这个冒犯:
SELECT A, B, C
FROM ( SELECT
lla.id as A,
max(decode(lla.attrid, 2, lla.valstr, null)) as B,
max(decode(lla.attrid, 3, lla.valstr, null)) as C
FROM
llattrdata lla,
llattrdata lla2
WHERE
lla.id = lla2.id
GROUP BY lla.id)
WHERE C = "Yes"
有更好的方法吗?我试图使用HAVING子句,但无法使其对C列=“是”起作用。提前谢谢。
答案 0 :(得分:3)
我会告诉你一个秘密。你拥有什么都没有错。所以不要重写它。
SELECT A, B, C
FROM ( SELECT
lla.id as A,
max(decode(lla.attrid, 2, lla.valstr, null)) as B,
max(decode(lla.attrid, 3, lla.valstr, null)) as C
FROM
llattrdata lla,
llattrdata lla2
WHERE
lla.id = lla2.id
GROUP BY lla.id)
WHERE C = 'Yes'
的表现与:
相同SELECT
lla.id as A,
max(decode(lla.attrid, 2, lla.valstr, null)) as B,
max(decode(lla.attrid, 3, lla.valstr, null)) as C
FROM
llattrdata lla,
llattrdata lla2
WHERE
lla.id = lla2.id
GROUP BY lla.id
HAVING max(decode(lla.attrid, 3, lla.valstr, null)) = 'Yes';
通过避免此处的内嵌视图,您将无法获得任何性能。无论哪个更具可读性,请继续使用。
答案 1 :(得分:2)
怎么样
SELECT
lla.id as A,
max(decode(lla.attrid, 2, lla.valstr, null)) as B,
'Yes' as C
FROM
llattrdata lla,
llattrdata lla2
WHERE
lla.id = lla2.id
GROUP BY lla.id
HAVING max(decode(lla.attrid, 3, lla.valstr, null)) = 'Yes'
您不能使用在同一查询中创建的别名。你必须再写一次
答案 2 :(得分:2)
SELECT
lla.id as A,
max(decode(lla.attrid, 2, lla.valstr, null)) as B,
max(decode(lla.attrid, 3, lla.valstr, null)) as C
FROM
llattrdata lla,
llattrdata lla2
WHERE
lla.id = lla2.id
GROUP BY lla.id
HAVING max(decode(lla.attrid, 3, lla.valstr, null)) = "Yes"
请阅读:Why can't I use alias in a count(*) "column" and reference it in a having clause?
答案 3 :(得分:1)
SELECT
lla.id as A,
max(decode(lla.attrid, 2, lla.valstr, null)) as B,
max(decode(lla.attrid, 3, lla.valstr, null)) as C
FROM
llattrdata lla,
llattrdata lla2
WHERE
lla.id = lla2.id
GROUP BY lla.id
HAVING max(decode(lla.attrid, 3, lla.valstr, null)) = 'Yes'
此子句在GROUP BY
之后进行评估,用于过滤分组结果。
不幸的是,你不能在having子句中使用别名。在某些情况下,子查询的意图可能比有条款更清晰。