有没有比使用子查询更好的方法来编写SQL SELECT语句?
我有一个问题:有没有比使用子查询更好的方法来编写SQL SELECT语句?,sql,oracle,select,subquery,Sql,Oracle,Select,Subquery,我有一个问题: 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
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=“Yes”对应。提前谢谢。怎么样
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'
不能使用在同一查询中创建的别名。您必须重新编写它使用:
此子句在分组依据
后求值,用于对分组结果进行筛选
不幸的是,不能在having子句中使用别名。在某些情况下,子查询的意图可能比having子句更清楚
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"
请阅读以下内容:我会让你知道一个秘密。你所拥有的没有什么问题。因此,不要满足重写它的需要
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';
在这里避免内联视图不会获得任何性能。无论哪一个对您来说更可读,都可以使用它。这是无效的SQL,除非您有一个名为
Yes
的列。派生表(它不是子查询)没有任何处理开销,只是语法上的糖分,所以不用担心。这里有几个很好的答案,但在您继续谈论性能时,我检查了您的答案。我喜欢“是”作为C。我没想到。
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';