2

我的目标是编写查询。我有三个表,A、B 和 C。这些表的编写方式是 A.bID = B.bID,B.cID = C.cID。这基本上允许我编写一个查询,将记录从 a 链接到 b,并将 b 记录链接到 c 的记录。到目前为止一切顺利,简单的查询。

我的问题是......查询中包含的列之一(我们称之为C.col3)必须具有唯一值;该列的值在查询结果中只能出现一次,而其他表中的其他列则没有这个要求。

有人可以帮我写这个查询吗?

谢谢...

更新1:

这是表格布局(对不起,我必须使用通用名称)

表 A
aID、bID、aCol1、aCol2、aCol3 ... aCol10

表 B
出价、cID、bCol1、bCol2、bCol3 ... bCol10

表 C
cID, cCol1, cCol2, col3 , cCol4 ... cCol10

如果没有 col3 中的唯一值约束,我会这样编写查询:

SELECT
    A.aID, A.bID, A.aCol1 ... A.aCol10,
    B.bID, B.cID, B.bCol1 ... B.bCol10,
    C.cID, C.cCol1, C.cCol2, C.col3 ... C.cCol10
FROM
    A, B, C
WHERE 
    A.bID = B.bID AND B.cID = C.cID

...但当然这并不能确保 C.col3 中的值是唯一的。

更新 2: 更多信息...
表 A 和表 B 具有一对多关系;A是“标题”,B是“项目”。
表 B 和表 C 具有一对一的关系。

这些表是缓存机制的一部分,所以很多数据看起来很相似,但在某些列中仍然不同。

由于 A 是表头,大部分重复值会在 A 中找到。

我首先需要按 A.aID 对行进行排序,但之后我只需要返回第一行,而 C.col3 的值不需要出现在该列的前一行。

这是否使事情更清楚了,还是我仍然没有任何意义?:)

最终更新:

我选择了 Bartosz Klimek 的答案,因为它最接近我的需要;我只需要修改中间的嵌套连接子句。

感谢大家的帮助!

4

5 回答 5

3

我将快速举一个你正在尝试做的事情的小例子,希望这将有助于澄清为什么你所问的(目前)是不可能的。

如果您有一个客户表 [CustomerID, CustomerName] 和一个订单表 [OrderID, CustomerID, DollarAmount]

如果您想要客户的所有订单:

SELECT CustomerName, OrderID, DollarAmount
FROM Customer, Orders
WHERE Customer.CustomerID = Orders.CustomerID

它会回来

 "Acme Corp.", 1, $2300
 "Acme Corp.", 2, $3022
 "A company",  3, $1234

一切都是好的。

但是您的问题的等价物是要求此查询,但具有唯一的 CustomerNames。在“Acme Corp”旁边,您会为 OrderID 和 DollarAmount 显示什么?

你可以使用聚合来显示一些东西,

SELECT CustomerName, MAX(OrderID), SUM(DollarAmount)
FROM Customer, Orders
WHERE Customer.CustomerID = Orders.CustomerID
GROUP BY Orders.CustomerID

但我相信您提到您不想使用聚合。

这是否清楚地解释了这个问题?

于 2009-03-31T15:33:58.380 回答
2

我开始发布另一个答案,但在重新考虑后我删除了它。如果我正确阅读了这个问题,我认为这是一个不可能/不合逻辑的问题。让我用一个例子来解释。如果我读错了,请举例说明您要查找的内容。

表 A

出价 COL1
1 价值1
2 值1
3 价值2

表 B

投标 CID COL 2
1 4 价值X
2 5 值Y
3 6 值Z

表 C

CID COL3
4 价值#
5 价值@
6价值~

预期结果

A.Col1 A.BID B.BID B.CID B.COL2 C.CID C.COL3
价值1??1 1 4 值X 4 值#
价值1??2 1 5 价值Y 5 价值@
值2 3 3 6 ValyeZ 6 值~

根据您不希望在第一列中重复 value1 的问题,但是如果您没有唯一约束,您建议在第二行中通常会重复什么?

于 2009-03-31T15:01:41.937 回答
1
SELECT A.*, B.*, C.*
  FROM C
    JOIN B ON B.cID = C.cID
    JOIN A ON A.bID = B.bID
    JOIN
    (
      SELECT id = min(aID)
        FROM C
          JOIN B ON B.cID = C.cID
          JOIN A ON A.bID = B.bID
        GROUP BY col3
    ) D ON D.id = A.aID

请注意,最后的子查询确保对于每个 col3 值,您在最终结果集中最多有一条记录。选择的记录是具有最小 aID 的记录。显然我假设aID、bID 和cID 分别是A、B 和C 的主键。

于 2009-03-31T15:23:44.130 回答
0
select distinct c.col3 from c inner join b on c.cID = b.cID inner join a on b.bID = a.bID
于 2009-03-31T14:17:40.870 回答
0

如果您还需要表中的其他值,请使用:

select max(a.col1), sum(b.col2), col3 from a, b, c
where A.bID = B.bID, and B.cID = C.cID
group by C.col3

在所有未分组的列上,您需要使用聚合函数,例如

  • AVG:列的平均值。
  • 计数:记录数。
  • MAX:列的最大值。
  • MIN:列的最小值。
  • SUM:列的总和。
于 2009-03-31T14:22:14.293 回答