我在 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) .
我希望这可以提供更多的清晰度。