-2

我在 SQL Server 数据库中有几个表,其中两个(Table1Table2)我想从中选择一个特定的子集,以填充第三个表(Table3)。

Table1共有 25 列,我只对其中的 3 列感兴趣,我们称它们Col1Col2Col3。这三个在此表中都不是唯一的,但我想提取唯一的对,如下所示:

  • 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,但不是每个组合都存在(这很有帮助),因为 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

现在我的最后一个问题是,不幸的是,有一些(很少)组合确实Col1Col2导致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) .

我希望这可以提供更多的清晰度。

4

2 回答 2

1

也许这样?

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
于 2020-08-06T20:58:27.217 回答
0

“第一个问题是 Col3 不能简单地添加为 GROUP BY 的一部分,因为它可能有不同的值,这会导致 Col1 + Col2 的重复组合被返回。”

您可以将不同值的查询作为派生表放入选择联合子查询中,并在派生表上进行分组。

于 2020-08-06T21:08:18.380 回答