【问题标题】:Sql Query with unique column value具有唯一列值的 Sql 查询
【发布时间】:2023-03-28 00:51:01
【问题描述】:

我的目标是编写查询。我有三个表,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 的答案,因为它最接近我的需要;我只需要修改中间的嵌套连接子句。

谢谢大家的帮助!

【问题讨论】:

  • 我应该补充一点,我知道我可能会做一些类似嵌套选择语句的事情......(其中 c.col3 in (select unique(c.col3) from...))等.,但想知道是否有更好/正确的方法来做到这一点。
  • 正如其他人所发布的,DISTINCT 可能就是您所追求的。但是,从事物的声音来看,您的问题可能比这更复杂。您能否发布更多关于您的表格、表格内容以及您希望看到的实际结果的信息?
  • 我同意 Robin,如果没有更多信息,我们将无法为您提供帮助。仅仅做一个 DISTINCT 可能不会是你正在寻找的答案。
  • 是的,应该更清楚...实际查询包含超过 20 列,加上需要不同值的列,因此在其他列上使用带有聚合函数的 group by 不会工作.我正在使用 JDBC。
  • 我对Java方面的开发不是很熟悉,但是JDBC不是数据库驱动标准吗?它不是数据库管理系统。您能否提供一些数据来帮助我们为您提供帮助。正如 JohnFx 指出的那样,目前提供的问题是有缺陷的。

标签: sql unique


【解决方案1】:

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

如果您有一个客户表 [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

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

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

【讨论】:

  • 我认为 Bartosz Klimek 所写的内容已接近目标;您假设我希望返回其他行(并且无法看到“col3”列中的内容);如果该行的 col3 中的值已经可以在另一行中找到,那么我根本不需要该行。
  • 顺便说一句,非常感谢您的帮助;我无法以“可以理解”的方式解释我的问题,但没有透露信息。我无权透露:)
  • 我也是“不可能”。我的意思是+1。
  • @unknown -- 看看 Nathan 的例子,告诉我们,在这种情况下你真正想要什么输出,以及决定它的逻辑是什么?
  • 请看我的第二次更新;如果可以在前一行中找到客户的姓名,我根本不需要该行。
【解决方案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 在第一列中重复的问题,但是如果您没有唯一约束,您建议进入第二行通常会重复什么?

【讨论】:

  • +1,我完全同意,这个问题有缺陷/无法回答。
  • 顺便说一句:对不起,我的示例中的格式。它在预览中看起来不错,但在我保存它们后它完全破坏了我的表。
  • 终于把格式弄对了。我猜预览会显示嵌入的 HTML 表格,而常规视图会将它们去掉。谁知道?
【解决方案3】:
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的主键。

【讨论】:

    【解决方案4】:
    select distinct c.col3 from c inner join b on c.cID = b.cID inner join a on b.bID = a.bID
    

    【讨论】:

    • 这对他不起作用,他希望检索多个列并且只在 c.col3 上具有不同的列,而不是在所有列上。
    【解决方案5】:

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

    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:列的总和。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 2016-05-15
      • 2020-04-08
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      相关资源
      最近更新 更多