gpt4 book ai didi

SQL Join 忽略多个匹配项(模糊结果正常)

转载 作者:行者123 更新时间:2023-12-04 18:26:01 29 4
gpt4 key购买 nike

我什至不知道我的问题的名称是什么,所以我只想放一些示例数据。我不介意这方面的模糊结果(这是我能想到的最好的表达方式。我不介意我是否忽略了一些数据,这是为了近似评估,而不是为了详细会计,如果这有意义的话)。但是我确实需要表 1 中的每条记录,并且我想避免下面指出的空值情况。

这可能吗?

TABLE 1
acctnum sub fname lname phone
12345 1 john doe xxx-xxx-xxxx
12346 0 jane doe xxx-xxx-xxxx
12347 0 rob roy xxx-xxx-xxxx
12348 0 paul smith xxx-xxx-xxxx

TABLE 2
acctnum sub division
12345 1 EAST
12345 2 WEST
12345 3 NORTH
12346 1 TOP
12346 2 BOTTOM
12347 2 BALLOON
12348 1 NORTH

因此,如果我们执行“常规外部”连接,我们会得到一些这样的结果,因为 sub 0 与第二个表不匹配:
TABLE AFTER JOIN
acctnum sub fname lname phone division
12345 1 john doe xxx-xxx-xxxx EAST
12346 0 jane doe xxx-xxx-xxxx null
12347 0 rob roy xxx-xxx-xxxx null
12348 0 paul smith xxx-xxx-xxxx null

但我宁愿得到
TABLE AFTER JOIN
acctnum sub fname lname phone division
12345 1 john doe xxx-xxx-xxxx EAST
12346 0 jane doe xxx-xxx-xxxx TOP
12347 0 rob roy xxx-xxx-xxxx BALLOON
12348 0 paul smith xxx-xxx-xxxx NORTH

我试图避免:
TABLE AFTER JOIN
acctnum sub fname lname phone division
12345 1 john doe xxx-xxx-xxxx EAST
12345 1 john doe xxx-xxx-xxxx WEST
12345 1 john doe xxx-xxx-xxxx NORTH
12346 0 jane doe xxx-xxx-xxxx TOP
12346 0 jane doe xxx-xxx-xxxx BOTTOM
12347 0 rob roy xxx-xxx-xxxx BALOON
12348 0 paul smith xxx-xxx-xxxx NORTH

所以我决定使用联合和两个 if 条件。对于在表 1 中定义但不在表 2 中定义子帐户的条件,我将接受空值,对于其他所有内容,我将只与最小值匹配。

最佳答案

如果我理解正确,您似乎正在尝试加入 sub列如果匹配。如果 sub 上没有匹配项,然后您希望它为该 acctnum 选择“第一”行.这样对吗?

如果是这样,您需要在完整匹配中左连接,然后在 select 上执行另一个左连接。决定 division 的语句对应最低的sub值(value) acctnum . row_number()函数可以帮助你,像这样:

select
t1.acctnum,
t1.sub,
t1.fname,
t1.lname,
t1.phone,
isnull(t2_match.division, t2_first.division) as division

from table1 t1

left join table2 t2_match on t2_match.acctnum = t1.acctnum and t2_match.sub = t1.sub
left join
(
select
acctnum,
sub,
division,
row_number() over (partition by acctnum order by sub) as rownum

from table2
) t2_first on t2_first.acctnum = t1.acctnum

编辑

如果您根本不关心在不存在匹配子项时从表 2 中返回哪条记录,则可以将两个不同的查询(一个与子项匹配,一个只取最小或最大除法)与 union .
select
t1.acctnum,
t1.sub,
t1.fname,
t1.lname,
t1.phone,
t2.division

from table1 t1

join table2 t2 on t2.acctnum = t1.acctnum and t2.sub = t1.sub

union

select
t1.acctnum,
t1.sub,
t1.fname,
t1.lname,
t1.phone,
min(t2.division)

from table1 t1

join table2 t2 on t2.acctnum = t1.acctnum
left join table2 t2_match on t2_match.acctnum = t1.acctnum and t2_match.sub = t1.sub

where t2_match.acctnum is null

就个人而言,我没有找到 union语法更加引人注目,您现在必须在两个地方维护查询。出于这个原因,我更喜欢 row_number()方法。

关于SQL Join 忽略多个匹配项(模糊结果正常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3143732/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com