我在SQLServer数据库中有几个表,其中两个( 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
,但并不是每个组合都作为 JOIN
可以用来过滤掉无效的组合:
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
值,如何编写 SELECT
提取三列,确保 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)。
我希望这能让你更清楚一点。
2条答案
按热度按时间khbbv19g1#
也许是这边?
brvekthn2#
第一个问题是col3不能简单地作为group by的一部分添加,因为它可能有不同的值,这会导致返回col1+col2的重复组合
可以将不同值的查询作为派生表放入select union子查询中,并对派生表进行分组。