我在 SQL Server 数据库中有几个表,其中两个(Table1
和Table2
)我想从中选择一个特定的子集,以填充第三个表(Table3
)。
Table1
共有 25 列,我只对其中的 3 列感兴趣,我们称它们Col1
为Col2
和Col3
。这三个在此表中都不是唯一的,但我想提取唯一的对,如下所示:
Col1
+Col2
= 的唯一键Table3
。Col3
+Col2
=可选,外键入Table2
。
Table3
从Table1
以下 SQL中提取唯一键可以正常工作:
SELECT Col1, Col2
FROM Table1
GROUP BY Col1, Col2
然而,这是缺失的Col3
。第一个问题是Col3
不能简单地添加为的一部分,GROUP BY
因为它可以有不同的值,这会导致Col1
+Col2
的重复组合被返回。
这就是Table2
发挥作用的地方;Col3
+在 中Col2
形成一个唯一键Table2
,但不是每个组合都存在(这很有帮助),因为 aJOIN
可用于过滤掉无效组合:
SELECT a.Col1, a.Col2, a.Col3
FROM Table1 a
JOIN Table2 b ON b.Col3 = a.Col3 AND b.Col2 = a.Col2
GROUP BY a.Col1, a.Col2, a.Col3
现在我的最后一个问题是,不幸的是,有一些(很少)组合确实Col1
会Col2
导致Table3
.
如果我们假设丢失一些Col3
值是可以的,我如何编写 aSELECT
来提取三列,确保组合Col1
+Col2
是唯一的?如果可能的话,保留一个Col3
提供有效组合键的值Table2
。
我已经搞砸了添加TOP 1
,但我没有让任何事情符合我的喜好......
编辑:根据要求提供示例数据。
Table1
| Col1 | Col2 | Col3 |
| 100 | 00 | 010 |
| 100 | 10 | 020 |
| 200 | 00 | 030 |
| 300 | 00 | 040 |
| 300 | 00 | 040 |
| 400 | 10 | 050 |
| 400 | 10 | 060 |
| 400 | 10 | 070 |
Table2
| Colx | Col2 | Col3 |
| car | 00 | 010 |
| cat | 10 | 030 |
| dog | 00 | 040 |
| bee | 10 | 040 |
| eye | 10 | 060 |
| bit | 10 | 070 |
Table3
| Col1 | Col2 | Col3 |
| 100 | 00 | 010 |
| 100 | 10 | 020 |
| 200 | 00 | 030 |
| 300 | 00 | 040 |
| 400 | 00 | 060 |
第三个表显示了我正在寻找的结果 - 该表仅包含Col1
+的唯一组合,Col2
还包含一个Col3
值,最好是在第二个表中提供值组合的值Col2
(即最后一个条目,400、00、060) .
我希望这可以提供更多的清晰度。