sql—选择值以创建具有可选外键的唯一行

new9mtju  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(488)

我在SQLServer数据库中有几个表,其中两个( Table1 以及 Table2 )我想从中选择一个特定的子集来填充第三个表( Table3 ).
Table1 共有25列,我只对其中的3列感兴趣,我们称之为 Col1 , Col2 以及 Col3 . 这三个在这个表中都不是唯一的,但是我想提取唯一的对,如下所示: Col1 + Col2 =的唯一键 Table3 . Col3 + Col2 =可选,外键输入 Table2 .
提取的唯一键 Table3Table1 以下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)。
我希望这能让你更清楚一点。

khbbv19g

khbbv19g1#

也许是这边?

SELECT a.Col1, a.Col2, Max(a.Col3)
FROM Table1 a
LEFT JOIN Table2 b ON b.Col3 = a.Col3 AND b.Col2 = a.Col2
GROUP BY a.Col1, a.Col2
brvekthn

brvekthn2#

第一个问题是col3不能简单地作为group by的一部分添加,因为它可能有不同的值,这会导致返回col1+col2的重复组合
可以将不同值的查询作为派生表放入select union子查询中,并对派生表进行分组。

相关问题