【问题标题】:How can I write query where query with specific where condition?如何编写具有特定 where 条件的查询 where 查询?
【发布时间】:2018-08-14 23:08:18
【问题描述】:

我有一张表,有一个主键和三个外键。 这是我的数据表

Id      RegistrationId        GroupId      ItemId   Value    
2345     68038                677           672      679    
3562     68038                357           783      423    
8236     NULL                 268           578      914    
7327     NULL                 677           672      467    
8733     NULL                 357           783      234

我想写查询来得到这个结果

Id      RegistrationId        GroupId      ItemId   Value
2345     68038                677           672      679
3562     68038                357           783      423    
8236     NULL                 268           578      914

如您所见,我想要所有具有 RegistrationId 68038 的行,并且我还想要其他 GroupId 和 ItemId 的其他默认值。我怎样才能编写 SQL 查询来获得类似上面的结果?感谢您的回复。我如何在 MySQL 中做到这一点?

【问题讨论】:

  • 您的问题不清楚。最后两个条目会发生什么?
  • 您可以看到表有 5 行,结果应该有 3 行,因为未显示表中的最后两行,因为 RegistrationId 68038 已经具有 GroupId 677 ItemId 672 和 GroupId 357 ItemId 783 的值
  • “我什么都没试过,我完全没有想法”
  • mysql, sql-server,postgresql,plsql - 你使用的是哪一个?,你如何决定 id 2345 应该排在第一位?我的意思是是否有任何其他 datetime 列指定了顺序还是顺序的(尽管它没有出现在您的结果集中)?

标签: mysql sql sql-server postgresql plsql


【解决方案1】:

您已经标记了多个数据库,假设它是一个 SQL Server。

试试这个查询,它会给你想要的输出。

SELECT Id,RegistrationId ,GroupId,ItemId,Value FROM
(
  SELECT * ,
  ROW_NUMBER() OVER( PARTITION BY GroupId,ItemId   ORDER BY RegistrationId DESC) RN
  FROM [TABLE_NAME]
 ) T
WHERE T.RN=1
ORDER BY RegistrationId DESC

示例数据示例

;WITH MY AS 
(
  SELECT * FROM (VALUES
  (2345 ,  68038  ,  677 , 672 , 679 ),
  (3562 ,  68038  ,  357 , 783 , 423 ), 
  (8236 ,  NULL   ,  268 , 578 , 914 ),
  (7327 ,  NULL   ,  677 , 672 , 467 ),
  (8733 ,  NULL   ,  357 , 783 , 234 ) 
  ) T(Id,RegistrationId ,GroupId,ItemId,Value)
)

SELECT Id,RegistrationId ,GroupId,ItemId,Value FROM
(
  SELECT * ,    
  ROW_NUMBER() OVER( PARTITION BY GroupId,ItemId   ORDER BY RegistrationId DESC) RN
  FROM MY
 ) T
WHERE T.RN=1
ORDER BY RegistrationId DESC

输出:

+------+----------------+---------+--------+-------+
| Id   | RegistrationId | GroupId | ItemId | Value |
+------+----------------+---------+--------+-------+
| 3562 | 68038          | 357     | 783    | 423   |
+------+----------------+---------+--------+-------+
| 2345 | 68038          | 677     | 672    | 679   |
+------+----------------+---------+--------+-------+
| 8236 | NULL           | 268     | 578    | 914   |
+------+----------------+---------+--------+-------+

【讨论】:

    【解决方案2】:

    我尝试了类似的方法并且它有效,但它有点硬编码方式:

        SELECT *
        FROM   MY
        WHERE  RegistrationId IS NOT NULL
        AND    GroupId IN (677, 357)
        UNION ALL
        SELECT *
        FROM   xxtest_tolga
        WHERE  GroupId NOT IN (677, 357);
    

    希望它对你有用。

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多