我如何获得第一个匹配的行?

时间:2014-01-15 23:41:11

标签: sql teradata

我有一个相当复杂的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。

任何帮助都非常感激。

3 个答案:

答案 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 :(得分:1)

以下查询将为每个公司ID获取一个名称。 Group by t2.company_idMAX(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可能表现更好。