如何将2个表连接在一起,从第二个表中仅从重复值中获取一行值

时间:2019-11-12 16:25:36

标签: sql sql-server

我有2张桌子,第一张桌子(已撤出)和第二张桌子(正在使用)。 撤回表中的一列称为“参考”,参考列有时具有重复的值(它应该是重复的)。操作表列是id(与撤回表中的参考列完全相同),名称和仓库。我需要保持第一个表的大小与行号完全相同(但在行号中),但要从手术表中添加名称和仓库号。

注意:在手术台中,名称和仓库栏对于每个单独的ID号始终是完全相同的。

当我尝试左联接时,我遇到的问题是查询将所有行重复多次。我认为这是因为手术台在许多不同的行中都包含相同的id值

SELECT * FROM withdrawn

LEFT JOIN operative ON id = reference

我希望查询返回

reference    depot     name
1            101       John Smith
1            101       John Smith
1            101       John Smith
2            102       Sam Turner
2            102       Sam Turner

我得到的是类似的东西

reference    depot     name
1            101       John Smith
1            101       John Smith
1            101       John Smith
1            101       John Smith
1            101       John Smith
1            101       John Smith
1            101       John Smith
1            101       John Smith
1            101       John Smith
2            102       Sam Turner
2            102       Sam Turner
2            102       Sam Turner
2            102       Sam Turner
2            102       Sam Turner
2            102       Sam Turner
2            102       Sam Turner
2            102       Sam Turner

4 个答案:

答案 0 :(得分:0)

您可以从子查询的第二个表中获得不同的值。对于每个不同的reference, depot组合,您的子查询将有1行。这将LEFT OUTER JOIN很好,并假设您在该reference表中的depotoperative为1:1,您应该获得所需的输出。

SELECT * 
FROM withdrawn
  LEFT JOIN (SELECT DISTINCT reference, depot FROM operative) op ON withdrawn.id = op.reference

答案 1 :(得分:0)

我相信这足以满足您的情况:

SELECT DISTINCT 
    w.reference
    , w.depot
    , o.name 
FROM withdrawn w
    LEFT JOIN operative o 
        ON o.id = w.reference

答案 2 :(得分:0)

在SQL Server中,您可以使用APPLY

SELECT w.*, o.depot
FROM withdrawn w OUTER APPLY
     (SELECT TOP (1) o.*
      FROM operative
      WHERE o.id = w.reference
     ) ;

这将返回任意匹配的行。如果需要特定的行(例如最旧的或最新的),可以在子查询中使用ORDER BY

答案 3 :(得分:0)

感谢大家的帮助。我尝试了几种方法,但没有得到我想要的确切结果。终于弄清楚了,这真的很简单。

SELECT * FROM WITHDRAWN
LEFT OUTER JOIN (SELECT DISTINCT o.reference, o.depot, o.name FROM OPERATIVE)  OPERATIVE ON w.reference = o.reference