我有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
答案 0 :(得分:0)
您可以从子查询的第二个表中获得不同的值。对于每个不同的reference, depot
组合,您的子查询将有1行。这将LEFT OUTER JOIN
很好,并假设您在该reference
表中的depot
:operative
为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