我的目标是写一个查询。我有三个表,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的答案,因为它最接近我的需要;我只需要修改中间的嵌套连接子句。
谢谢大家的帮助!
答案 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)
我开始发布另一个答案,但重新思考之后我删除了它。如果我正确地阅读这个问题,我认为这是一个不可能/不合逻辑的问题。让我举个例子来解释一下。如果我读错了,请说明你正在寻找的问题。
BID COL1 1 Value1 2 Value1 3 Value2
BID CID COL 2 1 4 ValueX 2 5 ValueY 3 6 ValueZ
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
在未按您分组的所有列上,您需要使用聚合函数,例如