Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有比使用子查询更好的方法来编写SQL SELECT语句?_Sql_Oracle_Select_Subquery - Fatal编程技术网

有没有比使用子查询更好的方法来编写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';