表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
答案 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进行演示。 (如果您下次在问题中输入测试数据也很不错。)