【问题标题】:Select from multiple tables where one has distinct values从具有不同值的多个表中选择
【发布时间】:2010-10-11 18:30:33
【问题描述】:

我在这里使用 SQL 视图有一个简单的问题。我现在似乎无法弄清楚。

  • 我有 2 个表,TableA 和 TableB。
  • 我想检索 TableA 中的 FieldA 和 TableB 中的 FieldB。
  • 这两个表使用一个 内连接。
  • 我只想要 TableA.FieldA 所在的行 是不同的。
  • 返回的值应该是 TableB.FieldB 中的前 10 项

简单地使用 SELECT DISTINCT 似乎是使用两个字段的组合来确定区别。

有什么想法吗?

这是当前返回所有行的 SQL 的模拟:

SELECT dbo.TableA.FieldA, dbo.TableB.FieldB
FROM dbo.TableA INNER JOIN dbo.TableB ON dbo.TableA.ID = dbo.TableB.TableAID

从这个标准查询返回的数据示例如下:

FieldA  FieldB
John    78
John    21
Claire  18
Sam     16
John    25
Claire  48
Paul    53

我希望从查询中返回的是:

John    78
Paul    53
Claire  48
Sam     16

**已编辑以尝试使事情更清晰并包含缺失的信息。

【问题讨论】:

  • 您的目标没有完全定义,这可能是问题的一部分。如果您只想从 TableA 中区分 FieldA,如果存在多个,则哪些规则确定您将使用 TableB 中的哪个 FieldA?
  • 您可能想要定义您的表数据。即第一组数据FieldA FieldB是来自TableB吗?而您希望TableB 中的前十名由什么定义?有订单吗?

标签: sql database select distinct


【解决方案1】:

如果基于连接的表 b 中的字段 A 有两个不同的值,您怎么知道要使用哪一个?

你可以试试这个,但它可能不会选择你想要的 b 值

SELECT dbo.TableA.FieldA, max(dbo.TableB.FieldA)
FROM dbo.TableA INNER JOIN dbo.TableB ON dbo.TableA.SomeID = dbo.TableB.SomeID
GROUP BY dbo.TableA.FieldA

【讨论】:

  • 你也需要 ORDER BY max(dbo.TableB.FieldA) DESC LIMIT 10 吗?
【解决方案2】:

这个怎么样?

SELECT TableA.FieldA,
       tmp.FieldB
FROM   TableA
       INNER JOIN
              (SELECT  TableAID,
                       FieldB
              FROM     TableB
              GROUP BY FieldA
              ORDER BY FieldB DESC
              ) AS tmp
       ON     TableA.ID = tmp.TableAID
ORDER BY tmp.FieldB DESC

【讨论】:

    【解决方案3】:

    根据您的answer,我认为您正在尝试做的是:

    将 TableB 中的 FieldB 求和,然后将其与 TableA 连接起来。

    SELECT   TableA.FieldA,
             tmp.SUMFieldB
    FROM     TableA
             INNER JOIN
                      (SELECT  TableAID,
                               SUM(FieldB) AS SUMFieldB
                      FROM     TableB
                      GROUP BY FieldA
                      ORDER BY SUMFieldB DESC
                      ) AS tmp
             ON       TableA.ID = tmp.TableAID
    ORDER BY tmp.SUMFieldB DESC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多