重用子查询

时间:2015-05-03 18:50:01

标签: performance sqlite reusability

我有一个包含两列的表:表和时间。 存储的数据可能是这样的:

|TABLES|TIME |
--------------
|   1  |19:00|
|   1  |20:00|
|   1  |22:00|
|   2  |21:00|
|   3  | null|
|   4  |20:00|

我想知道在桌子上是否与给定时间相关(返回1),如果没有,如果它在另一时间可用(返回0)或者它是否根本不可用(返回 - 1)。

例如,如果我想在" 20:00"我应该得到:

|TABLES|RESULT|
--------------
|   1  |   1  |
|   2  |   0  |
|   3  |  -1  |
|   4  |   0  |

我试过这个,但它说"错误:没有这样的专栏:tab"。 有人能帮助我吗?

SELECT
    tab,
    (SELECT CASE
        WHEN (SELECT Count() FROM reg_book WHERE tables=tab AND time ="20:00") !=0 
            THEN 1 
        WHEN (SELECT Count() FROM reg_book WHERE tables=tab) !=0
            THEN 0 
        ELSE -1 END
    )
from (SELECT tables FROM reg_book) as tab;
PD:我已经检查了下面的另一个问题,但没有工作...... How to reuse a result column in an expression for another result column

1 个答案:

答案 0 :(得分:0)

tab是子查询(虚拟表)的名称,而不是列的名称。 该列的名称为tab.tables

SELECT
    tab.tables,
    (SELECT CASE
        WHEN (SELECT Count() FROM reg_book WHERE tables=tab.tables AND time ="20:00") !=0 
            THEN 1 
        WHEN (SELECT Count() FROM reg_book WHERE tables=tab.tables) !=0
            THEN 0 
        ELSE -1 END
    )
from (SELECT tables FROM reg_book) as tab;

就此而言,将简单的SELECT ... FROM包装到子查询中是多余的:

SELECT
    tab.tables,
    (SELECT CASE
        WHEN (SELECT Count() FROM reg_book WHERE tables=tab.tables AND time ="20:00") !=0 
            THEN 1 
        WHEN (SELECT Count() FROM reg_book WHERE tables=tab.tables) !=0
            THEN 0 
        ELSE -1 END
    )
FROM reg_book AS tab;