如何在第一行的DB2 iseries中LEFT JOIN?

时间:2013-11-04 17:56:04

标签: sql db2 iseries-navigator

我需要一个查询,使用其他表值的第一行来加入TABLE:

 SELECT * FROM TABLEA A LEFT JOIN
    (SELECT * from TABLEB
       WHERE FIELD1 <> '3' and FIELD2 = 'D' AND A.CODE=CODE
      FETCH FIRST 1 ROW ONLY
     ) B
 on a.FIELDA = b.FIELDA
 and A.FIELDB = B.FIELDB

但DB2返回ERROR,因为无法使用 A.CODE

怎么能解决这个问题?

3 个答案:

答案 0 :(得分:5)

您需要使用嵌套表格表达式

SELECT * FROM TABLEA A LEFT JOIN
  LATERAL (SELECT * from TABLEB
     WHERE FIELD1 <> '3' and FIELD2 = 'D' AND A.CODE=CODE
     FETCH FIRST 1 ROW ONLY
  ) B
on a.FIELDA = b.FIELDA
and A.FIELDB = B.FIELDB

答案 1 :(得分:1)

这是一个高度优化的声明。 你没有从tableb获得任何数据,也没有从第一行获取数据,所以你只需要exists子句。

select a.* from tablea a 
where exists (select * from tableb b 
    where a.fielda = b.fielda 
    and a.fieldb = b.fieldb 
    and b.code = a.code 
    and b.field2 = 'd' and b.field1 <> '3')

答案 2 :(得分:0)

您可以使用OLAP函数row_number()根据(fielda,fieldb,code)组中的某些字段对记录进行排名。例如,Somefield可能是事务id或序列。 order by子句在那里是可选的,但没有它,你可能会随机选择哪个记录是组中的第一个。

 WITH B AS
 (SELECT *,
         row_number() over (partition by fielda,fieldb,code
                            order     by somefield
                           ) as pick 
    from TABLEB
    WHERE FIELD1 <> '3'
      and FIELD2 = 'D'
 )
 SELECT * 
   FROM TABLEA A LEFT JOIN B

       on a.FIELDA = b.FIELDA
      and A.FIELDB = B.FIELDB
      and A.CODE   = B.CODE
   where pick=1