仅使用select查询的SQL一对一映射

时间:2012-06-25 06:04:47

标签: sql database select cursor

我有两个名为LeftTable和RightTable的表,如下所示

LeftTable

obsid    Name      Value                 
1        Ronak     A                      
2        Aakash    B                      
3        Pankti    C                      
4        Sanket    D     

RightTable

obsid        Name       Value
1            Jhone      F
2            Isabella   M
3            Jonathan   L
4            javafx     p                 

现在,当我在某些条件下左键加入时,输出将如下所示

ResultTable

obsid    Name      Value                  obsid        Name       Value
-------------------------------------------------------------------------
1        Ronak     A                      1            Jhone      F
1        Ronak     A                      2            Isabella   M
1        Ronak     A                      3            Jonathan   L
1        Ronak     A                      4            javafx     p
2        Aakash    B                      2            Isabella   M
2        Aakash    B                      3            Jonathan   L 
2        Aakash    B                      4            javafx     p
3        Pankti    C                      3            Jonathan   L
3        Pankti    C                      4            javafx     p
4        Sanket    D                      4            javafx     p

这个Left Join帮助我在我的应用程序中实现一对多关系。

左连接条件在我的应用程序中是动态的。所以这只是我在这里展示的一个例子。假设上面例子中的左连接条件是LeftTable.Obsid< = RightTable.Obsid 现在我想实现一对一的关系。 一对一关系意味着当任何权利表记录与任何剩余记录相关联时,该权利记录不能与任何其他左表记录链接。

对于上面的例子,一对一的输出如下

obsid    Name      Value                  obsid        Name       Value
1        Ronak     A                      1            Jhone      F
2        Aakash    B                      2            Isabella   M
3        Pankti    C                      3            Jonathan   L
4        Sanket    D                      4            javafx     p

我已经通过两种方式实现了这一功能:

  1. 使用光标
  2. 使用选择查询逐个获取记录
  3. 数据库表在我的应用程序中是动态的。因此,虽然在数百万条记录上进行处理需要花费太多时间来逐一取出记录并对其进行处理需要时间。

    有没有办法在单一选择查询中实现一对一关系?

    我想避免一个接一个地记录,我正在使用Mysql数据库

    请帮帮我。

1 个答案:

答案 0 :(得分:1)

只需使用内连接即可实现示例中显示的所需输出。

select * from LeftTable L inner join RightTable R
on L.obsid=R.obsid

但如果左表中有重复的黑名单,您可以使用以下查询

   select  A.obsid,A.Name,A.Value, R.obsid,R.Name,R.Value from(
     select *,row_number() over (partition by obsid order by obsid ) as row_num 
    from LeftTable)A
     inner join RightTable R
     on A.obsid=R.obsid
     where A.row_num=1

请告诉我这是您的期望