【问题标题】:SQL How to return one ID in a select distinct query with multiple IDs in a table while still returning all other IDs as well (not just the top row)SQL如何在表中具有多个ID的选择不同查询中返回一个ID,同时仍返回所有其他ID(不仅仅是顶行)
【发布时间】:2018-02-03 17:44:56
【问题描述】:

我正在使用 Microsoft SQL 服务器。 下面的查询会生成一个类似这样的表:

idnumber | checkID | taskID | status
1001     | 9000    | 410    | Approved
1001     | 9001    | 410    | Approved
1001     | 9002    | 410    | Approved
1201     | 9100    | 430    | Approved
1201     | 9101    | 430    | Approved

...我需要的是只返回其中一个 idnumber 的查询,而不管其他数据如何(这样只有一个 idnumber 被“批准”,而其他的没有)。

我想要的结果类似于:

身份证号 |检查ID |任务ID |状态
1001 | 9000 | 410 |已批准
1201 | 9100 | 430 |已批准

到目前为止我的查询:

SELECT DISTINCT viewTable.idnumber
              , viewTable.checkID
              , viewTable.taskID
              , 'Approved' AS status
FROM    viewTable

INNER JOIN anotherTable
    ON viewTable.idnumber = anotherTable.idnumber

INNER JOIN someOtherTable
ON someOtherTable.idnumber = anotherTable.idnumber

WHERE anotherTable.CODE = 'DesiredCode'

关于这个问题的更多信息: 我在 anotherTable.CODE 中查找了一个特定值,并且只想“批准”该特定代码。上面的查询批准任何返回 idnumber 的内容。

【问题讨论】:

  • 它确实返回了不同的记录。不要包括使其不明显的其他列。和/或根据需要使用连接或子查询分别获取这些列。
  • 您使用的是哪个数据库?
  • 只需从您的选择语句中删除 checkid 和 taskid !
  • 您可以使用 top 或 limit 取决于您正在使用的数据库
  • 我正在使用 Microsoft SQL 服务器。

标签: sql sql-server


【解决方案1】:

您可以使用诸如maxmin 之类的聚合函数来只对一列中的唯一值感兴趣:

SELECT viewTable.idnumber
              , MAX(viewTable.checkID) AS checkID
              , MAX(viewTable.taskID) AS taskID
              , 'Approved' AS status
FROM    viewTable

INNER JOIN anotherTable
    ON viewTable.idnumber = anotherTable.idnumber

INNER JOIN someOtherTable
ON someOtherTable.idnumber = anotherTable.idnumber

WHERE anotherTable.CODE = 'DesiredCode'
GROUP BY viewTable.idnumber

【讨论】:

  • @scaisEdge OP 是否意味着每个 taskID 一个 IDNumber,而不是每个 IDnumber 一个 TaskID?
  • 我不知道 OP 的意思是我只看提供的样本。
  • 我只需要一个 ID 号,不管任何 taskID。我只想“批准”每个 IDNumber 的一项任务。
  • 每个 IDNumber 的一个任务应该用我给出的答案来解决。
  • 做到了!我仍然需要列名,所以我编辑了帖子以添加“AS checkID”和“AS taskID”。非常感谢大家!我为我原来帖子的措辞道歉,但我们都通过了它。再次感谢!
【解决方案2】:

一个简单的方法是使用 TOP 1 获得第一行

  SELECT TOP 1 DISTINCT viewTable.idnumber
                , viewTable.checkID
                , viewTable.taskID
                , 'Approved' AS status
  FROM    viewTable

  INNER JOIN anotherTable
      ON viewTable.idnumber = anotherTable.idnumber

  INNER JOIN someOtherTable
  ON someOtherTable.idnumber = anotherTable.idnumber

  WHERE anotherTable.CODE = 'DesiredCode'

最终以适当的顺序通过

【讨论】:

  • 这只会从 viewTable 返回一行。这是回答我的问题。我说的不好……
  • 我不明白你的评论..我的答案是你在寻找什么或者你需要更多?
猜你喜欢
  • 2018-09-02
  • 1970-01-01
  • 2020-11-06
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-15
  • 1970-01-01
相关资源
最近更新 更多