我有一个相当复杂的SQL查询 - 其中一部分需要查找第一个表中找到的company_ID值以获取第二个表中的company_Name。第二个表可能有公司名称的变体,但没关系 - 我只需要第一个匹配。
因此,tableA看起来像这样(大约二十几列和多行)
company_ID (CHAR(12))
161012348876
561254435253
103929478273
141567643542
tableB看起来像这样
company_ID (Integer) Company_name
161012348876 Watson & Jones Ltd
161012348876 Watson and Jones
561254435253 Fictional Co. plc
103929478273 Made Up Corp.
161012348876 Watson Jones Ltd
141567643542 Thingymajig Gmbh.
此查询将为161012348876返回多行。为每个匹配的company_id返回一行(即4行而不是6行),有什么好办法?
SELECT *, t2.company_name
FROM tableA t1
JOIN tableB t2 ON t1.company_id = cast(t2.company_id as CHAR(12))
我正在使用Teradata SQL。
任何帮助都非常感激。
答案 0 :(得分:1)
SELECT *, t2.company_name
FROM tableA t1
JOIN tableB t2 ON t1.company_id = cast(t2.company_id as CHAR(12))
GROUP BY t1.company_id
每个唯一t1.company_id
答案 1 :(得分:1)
以下查询将为每个公司ID获取一个名称。 Group by t2.company_id
和MAX(t2.company_name)
会为每个ID获取一个唯一的名称,然后将其与tableA
一起加入。
SELECT t1.Company_ID, t2.company_name
FROM tableA t1
JOIN (SELECT t2.company_id , MAX(t2.company_Name) [aName]
FROM tableB t2 GROUP BY t2.company_id ) as t3
ON t1.company_id = cast(t3.company_id as CHAR(12))
答案 2 :(得分:1)
您也可以执行
,而不是user2989408的MAX子查询SELECT company_id , company_Name
FROM tableB
QUALIFY ROW_NUMBER() OVER (PARTITION BY company_id ORDER BY company_name) = 1
--if you don't care about MIN/MAX or want a more random result:
QUALIFY COUNT(*) OVER (PARTITION BY company_id ROWS UNBOUNDED PRECEDING) = 1
但假设* company_id *是tableB的PI,MAX可能表现更好。