首页 > 解决方案 > 使用 SQL 作为 xlookup

问题描述

我有 3 个表需要从中检索数据 + 我还需要一个附加列 (ResearchIDName),其作用类似于 c2 表中的 xlookup。到目前为止,我已经创建了以下关于如何从 3 个表中检索所需数据的脚本,并附上了一张关于我的表的外观和结果应该如何的图像,但我需要关于这个附加列 (ResearchIDName) 的帮助。ResearchIDName 的 xlookup 公式为:XLOOKUP(O3,I:I,H:H)。所有研究 ID 都将出现在表 c2 的 SID 列中,而 Companynames 列指的是 SID 列,所以我需要的只是让这个单独的列提及研究 ID 公司的名称。你有什么建议吗?

*编辑 ResearchIDName 的结果将是在所有 SID 中搜索并从公司名称中检索名称。每个 SID 都有一个不同的 ResearchID。SID 名称可以是 McDonalds,而其 Research 名称可以是 KFC。结果中的 Companyname 目前显示的是 SID 的公司名称,我还需要 Research ID 的公司名称。

表c0

+-----+----------+ 
| FID | Comments |
+-----+----------+
| g17 | Food     |
| h11 | Retail   |
| j12 | Banks    |

表c1

+-------+-----+
|  SID  | FID |
+-------+-----+
| 12345 | g17 |
| 34567 | h11 |
| 56152 | j12 |
+-------+-----+

表c2

+-------+-------------+------------+
|  SID  | Companyname | ResearchID |
+-------+-------------+------------+
| 12345 | McDonalds   |      67789 |
| 34567 | Sainsbury's |      37832 |
| 56152 | Barclays    |            |
+-------+-------------+------------+

期望的结果

+-------+-----+----------+-------------+------------+----------------+
|  SID  | FID | Comments | Companyname | ResearchID | ResearchIDName |
+-------+-----+----------+-------------+------------+----------------+
| 12345 | g17 | Food     | McDonalds   |      29182 | KFC            |
| 34567 | h11 | Retail   | Sainsbury's |      91821 | Tesco          |
| 56152 | j12 | Banks    | Barclays    |            |                |
+-------+-----+----------+-------------+------------+----------------+

我的 3 张桌子和我想要的结果

Select c0.FID, c0.Comments,

c1.sid,

c2.Companyname, c2.ResearchID,

ResearchIDName

From c0

Left join c1 On c1.FID=c0.FID

Left join c2 On c2.SID=c1.SID

**编辑 @a_horse_with_no_name 建议的脚本在 ResearchID 是整数列时有效。就我而言,它是一个 varchar,这就是我不断收到错误的原因。但以下调整有效(在“on r.sid = c2.ResearchID”之后添加“::varchar”)

Select c0.FID, 
       c0.Comments,
       c1.sid,
       c2.Companyname, 
       c2.ResearchID,
       r.companyname as research_company_name
From c0
  Left join c1 on c1.FID = c0.FID
  Left join c2 on c2.sid = c1.sid
  left join c2 as r on r.sid = c2.researchid::varchar

 </p>

标签: sqlpostgresql

解决方案


假设KFCandTesco也存储在c2表中的某个位置(您没有显示,所以我不得不猜测),那么我会假设您只需要另一个联接:

Select c0.FID, 
       c0.Comments,
       c1.sid,
       c2.Companyname, 
       c2.ResearchID,
       r.companyname as research_company_name
From c0
  Left join c1 on c1.FID = c0.FID
  Left join c2 on c2.sid = c1.sid --<< changed from your original query
  left join c2 as r on r.sid = c2.researchid --<< this finds a company that matches the researchid column

您的查询包含on c2.SID = b2.SID会导致错误的连接条件,因为您的示例中没有别名b2。我猜你的意思是c2.sid = c1.sid


推荐阅读