简体   繁体   English

如何编写具有特定条件的查询?

[英]How can I write query where query with specific where condition?

I have one table with one primary key and three foreign keys. 我有一张带有一个主键和三个外键的表。 Here my table with data 这是我的数据表

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

I want to write query to get this result 我想写查询以获得此结果

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

As you can see I want all rows that have RegistrationId 68038 and I also want other default values for other GroupId and ItemId. 如您所见,我希望所有具有RegistrationId 68038的行,而且还希望其他GroupId和ItemId具有其他默认值。 How can I write SQL query to get result like above ? 我如何编写SQL查询以获取类似上述结果? Thanks on your responds. 感谢您的回应。 How can I do this in MySQL ? 如何在MySQL中做到这一点?

You have tagged multiple databases, assuming it to be a SQL Server. 您已经标记了多个数据库,并假设它是一个SQL Server。

Try this query, it will give you the desired output. 试试这个查询,它将为您提供所需的输出。

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

Example with sample data 示例数据示例

;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

Output: 输出:

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

I tried something like that and it worked, but its bit a hardcoded way: 我尝试过类似的方法,但它确实有效,但是它采用了硬编码的方式:

    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);

Hope it works for you. 希望对你有效。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM