当使用链接表oracle匹配多行时如何显示嵌套格式的行

时间:2018-11-20 09:12:42

标签: sql oracle

表1:收入

<xsl:template match="/">
    <html>
        <head>
            <title>Test</title>
            <style>
                table.dict { 
                  border: 1px solid black;
                  border-collapse: collapse;
                }
                table.dict th, table.dict td {
                  border: 1px solid black;
                }
            </style>
        </head>
        <body>
            <h1>Table</h1>
            <table class="dict">
                <thead>
                    <tr>
                        <th>free entry</th>
                        <th>forms/senses</th>
                    </tr>
                </thead>
                <tbody>
                    <xsl:apply-templates select="//tei:entryFree"/>
                </tbody>
            </table>
        </body>
    </html>
</xsl:template>

表2:实用程序

st_id, st_date,  st_sl, income_amount
-------------------------------------
12   11/11/2018   1    100
12   11/11/2018   2    10
13   11/11/2018   1    50

我希望结果为:

util_date, serial_no, st_id, st_date, st_sl, util_amount
----------------------------------------------------------
12/11/2018     1       12    11/11/2018  1    20
12/11/2018     2       12    11/11/2018  1    50
13/11/2018     1       12    11/11/2018  1    30
12/11/2018     1       13    11/11/2018  1    50

当链接表具有多行匹配时,我希望表1中有一行。像上面一样。

要实现这种结果,查询可以是什么?请帮忙。

以下查询是用于链接2个表的常规sql查询。它从收入表中给出类似记录的重复记录(由于在Util表的两行中存在收入表引用,因此意味着单行重复)。但是我想要收入表中的单行以及实用程序表中的多行,如上面的示例。

st_id, st_date,  st_sl, income_amount, util_date, util_amount
---------------------------------------------------------------
12      11/11/2018   1        100        12/11/2018     20
                                         12/11/2018     50
                                         12/11/2018     30
12      11/11/2018   2         10           null       null
13      11/11/2018   1         50        12/11/2018     50

1 个答案:

答案 0 :(得分:1)

正确的查询以显示所需的数据应该是

select st_id, st_date, st_sl, income_amount, util_date, util_amount
  from income i 
  left join util u on 
         i.st_id = u.st_id
     and i.st_date = u.st_date
     and i.st_sl = u.st_sl;

请注意加入条件中的左侧。

但是您希望将“重复”收入行抑制为单行。 可以通过多种方式完成此操作,但是一个想法是:

select case when util.serial_no = 1 then i.st_id end as st_id, 
       case when util.serial_no = 1 then i.st_date end as st_date, 
       case when util.serial_no = 1 then i.st_sl end as st_sl, 
       income_amount, 
       util_date, 
       util_amount
  from income i 
  left join util u on 
         i.st_id = u.st_id
     and i.st_date = u.st_date
     and i.st_sl = u.st_sl;
  

UPDATE1:

随着示例数据和说明的更改,另一个符合请求的查询将是:

select 
  case when row_number() over (partition by i.st_id, i.st_sl, u.util_date order by u.serial_no) = 1 
     then i.st_id 
  end as st_id, 
  case when row_number() over (partition by i.st_id, i.st_sl, u.util_date order by u.serial_no) = 1 
     then i.st_date 
  end as st_date, 
  case when row_number() over (partition by i.st_id, i.st_sl, u.util_date order by u.serial_no) = 1 
     then i.st_sl 
  end as st_sl, 
  i.income_amount, 
  u.util_date, 
  u.serial_no,
  u.util_amount
from income i 
left join util u on 
         i.st_id = u.st_id
     and i.st_date = u.st_date
     and i.st_sl = u.st_sl;

因此,前三列仅获取std_id,st_sl,util_date组中前几行的值。

请参见fiddle进行演示。 (如果您下次在问题中输入测试数据也很不错。)