具有唯一列值的Sql Query

时间:2009-03-31 14:13:07

标签: sql unique

我的目标是写一个查询。我有三个表,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
bID,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的值不会出现在该col的前一行中。

这会让事情变得更清楚,还是我仍然没有任何意义? :)

最终更新:

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

谢谢大家的帮助!

5 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分:2)

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

表A

BID COL1
1   Value1
2   Value1
3   Value2

表B

BID CID COL 2
1   4   ValueX
2   5   ValueY
3   6   ValueZ

表C

CID COL3
4   Value#
5   Value@
6   Value~

预期结果

A.Col1   A.BID B.BID B.CID B.COL2 C.CID C.COL3
Value1?? 1     1     4     ValueX 4     Value#
Value1?? 2     1     5     ValueY 5     Value@ 
Value2   3     3     6     ValyeZ 6     Value~

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

答案 2 :(得分: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的主键。

答案 3 :(得分:0)

select distinct c.col3 from c inner join b on c.cID = b.cID inner join a on b.bID = a.bID

答案 4 :(得分: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:专栏的平均值。
  • COUNT:记录数。
  • MAX:列的最大值。
  • MIN:列的最小值。
  • SUM:列的总和。