【问题标题】:using field selected in outer part of query as parameter for sub query使用在查询外部选择的字段作为子查询的参数
【发布时间】:2017-05-05 20:45:11
【问题描述】:

如何使用在查询外部选择的字段作为子查询的参数?我认为这或多或少是这样,但显然不是应该返回几行

SELECT f1, f2, f3
FROM table1 t1
WHERE status = 1
AND (
      SELECT ref from table2 where altref = SUBSTR(t1.f2, 1,4)
    ) != NULL

更新 感谢到目前为止的所有答案。不过我应该说,使用 EXIST 会一直返回 true,因为子查询中的行将存在,只是不一定在 'altref' 中有一个值,所以我修改了 EXISTS 以在 alt ref 上包含 is not null .

【问题讨论】:

    标签: sql select oracle11g null correlated-subquery


    【解决方案1】:

    您的问题是!= NULL。这将始终使WHERE 子句中的过滤失败(结果将是NULL,这绝不是真的)。​​

    我想你想要:

    SELECT f1, f2, f3
    FROM table1 t1
    WHERE status = 1 AND
          EXISTS (SELECT 1 from table2 t2 where t2.altref = SUBSTR(t1.f2, 1, 4));
    

    如果t2.ref 可以是NULL,那么适当的版本是:

    SELECT f1, f2, f3
    FROM table1 t1
    WHERE status = 1 AND
          EXISTS (SELECT 1 
                  FROM table2 t2 
                  WHERE t2.altref = SUBSTR(t1.f2, 1, 4) AND t2.ref IS NOT NULL
                 );
    

    【讨论】:

      【解决方案2】:

      使用EXISTS

      SELECT f1, f2, f3
      FROM table1 t1
      WHERE status = 1
      AND exists (
                 SELECT ref from table2 where altref = SUBSTR(t1.f2, 1,4)
                 )
      

      【讨论】:

        【解决方案3】:

        这里的问题是您正在使用 [in]eqauity 运算符检查 nullNull 不是一个值 - 它是缺少它 - 因此,与它的任何值比较(例如,=!=> 等)都将返回“未知”(这是不正确的,因此任何返回评估的行都不会返回)。

        您应该使用IS 运算符:

        SELECT f1, f2, f3
        FROM table1 t1
        WHERE status = 1
        AND (
              SELECT ref from table2 where altref = SUBSTR(t1.f2, 1,4)
            ) IS NOT NULL
        -- Here^
        

        值得注意的是,顺便说一句,exists 运算符可能更优雅一点:

        SELECT f1, f2, f3
        FROM   table1 t1
        WHERE  status = 1 AND
               EXISTS (SELECT *
                       FROM   table2
                       WHERE  altref = SUBSTR(t1.f2, 1, 4))
        

        【讨论】:

          【解决方案4】:

          试试这个:

          SELECT f1, f2, f3
          FROM table1 t1
          INNER JOIN (
                SELECT ref from table2 where altref = SUBSTR(t1.f2, 1,4)
              ) as table2 on table2.altref = SUBSTR(t1.f2, 1,4)
          WHERE status = 1
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-07-03
            • 1970-01-01
            • 2011-11-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-01-17
            相关资源
            最近更新 更多