代码之家  ›  专栏  ›  技术社区  ›  AlexA

从嵌套select中引用外部字段?

  •  0
  • AlexA  · 技术社区  · 16 年前

    是否允许引用嵌套select中的外部字段?

    例如。

    SELECT
    FROM ext1
    LEFT JOIN (SELECT * FROM int2 WHERE int2.id = ext1.some_id ) as x ON 1=1
    

    在这种情况下,这将引用嵌套select中的ext1.some_id。 在这个例子中,我得到了一些错误,即字段ext1.some_id未知。 有可能吗?还有别的办法吗?

    更新:

    不幸的是,我必须使用嵌套select,因为我要向它添加更多的条件,如限制0,1 然后我需要在同一个表上使用限制为1.1的第二个联接(以联接另一行) 最终的目标是将同一个表中的两行连接起来,就好像它们是两个表一样。 所以我打算把一些相关的行“排列”成一行。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Peter Lang    16 年前

    对初始问题的回答是:否,删除子查询并将条件放入 ON -子句:

    SELECT *
    FROM ext1
    LEFT JOIN int2 ON ( int2.id = ext1.some_id )
    

    一种解决方案可能是使用变量查找第一行(或第二行),但此解决方案无法有效地处理索引,因此可能会导致性能问题。

    SELECT ext1.some_id, int2x.order_col, int2x.something_else
    FROM ext1
    LEFT JOIN (SELECT `int2`.*, @i:=IF(@id=(@id:=id), @i+1, 0) As rank
               FROM `int2`,
               ( SELECT @i:=0, @id:=-1 ) v
                  ORDER BY id, order_col ) AS int2x ON (     int2x.id = ext1.some_id
                                                                 AND int2x.rank = 0 )
    ;
    

    这假定您有一个要排序的列( order_col )左连接第一行 some_id .

        2
  •  0
  •   Álvaro González    16 年前

    你是说这个吗?

    SELECT ...
    FROM ext1
    LEFT JOIN int2 ON int2.id=ext1.some_id
    
        3
  •  0
  •   lc.    16 年前

    就是这样 ON 条款适用于:

    SELECT
    FROM ext1
    LEFT JOIN int2 AS x ON x.id = ext1.some_id