如何在记录中的子字符串上连接表?
Posted
技术标签:
【中文标题】如何在记录中的子字符串上连接表?【英文标题】:How can I join tables on a substring in a record? 【发布时间】:2014-08-12 17:39:10 【问题描述】:我有一个将名称与帐户 ID 相关联的表,如下所示
**Accounts**
name
account_id
另一个类似的表格将信息与帐户 uri 相关联
**Info**
information
account_uri
帐户 uri 如下所示:/some/random/path/123456/randomDigits
其中 123456 是与用户关联的 accound_id。
我怎样才能加入这些表,并得到类似的结果
**results**
name
information
这是一个亚马逊 redshift/postgresql 数据库。感谢您的建议!
【问题讨论】:
你的ids在account_uri中都是6位数吗? 5 到 7 位数字之间的任意位置 @johncorser 我相信 Mihai 想要得到的是,如果 ID 与 uri 号码匹配。 是的,account_id 匹配 uri 号 【参考方案1】:如果您无法将 account_id
放入 Info 表中,这将起作用:
SELECT A.Name,
I.Information
FROM Information I
JOIN Account A
ON A.account_id = REVERSE(SUBSTRING(REVERSE([account_uri]),0,CHARINDEX('/',REVERSE(account_uri))))
REVERSE(...)
用于创建 LastIndexOf 函数。
可能只想做:
SELECT REVERSE(SUBSTRING(REVERSE([account_uri]),0,CHARINDEX('/',REVERSE(account_uri))))
FROM Information
查看 SUBSTRING/REVERSE 是否获取了整个帐户 ID
这应该找到'/'之间的第二个字符串
SUBSTRING(REVERSE(SUBSTRING(REVERSE([account_uri]),CHARINDEX('/',REVERSE(account_uri)))),0,CHARINDEX('/',REVERSE(SUBSTRING(REVERSE([account_uri]),CHARINDEX('/',REVERSE(account_uri)))))
【讨论】:
谢谢!现在我得到一个空集。这可能与表格本身有关,所以我会尝试解决这个问题,一旦我确定它有效,我就会将其标记为已接受。 好的,我会在信息表中选择(添加)REVERSE
,以确保结果得到正确的值
啊,问题是 account_uri 的格式实际上是 /path/to/123456/randomNumbers 其中 123456 是 account_uri。我会修改这个问题。你知道如何加入吗?
如果合并数据,丑是可以的!
感谢您的帮助。当/如果我弄清楚了,我会在这里发帖。【参考方案2】:
效率不高,但你可以这样做:
select a.name, i.information
from accounts a join
info i
on i.account_uri like '%/' || a.account_id;
不幸的是,这种数据结构很难利用索引。
【讨论】:
它确实有效,但需要很长时间,而且我的数据集只会越来越大。【参考方案3】:另一种解决方案
SELECT a.name, i.information
FROM accounts AS a
INNER JOIN info AS i ON SUBSTRING_INDEX(i.account_url, '/', -1) = a.account_id
Demo
旁注:这根本不是一个合适的结构;)而且我不确定这是否适用于 PostgreSQL,因为 SUBSTRING_INDEX 函数。我真的没有注意到这与 PostgreSQL 有关。
【讨论】:
以上是关于如何在记录中的子字符串上连接表?的主要内容,如果未能解决你的问题,请参考以下文章
Datatable C# - 如何根据 ID 从一个表中获取详细记录及其关联的另一表中的子记录