SQL有条件地选择一行

标签 sql

我想知道是否可以在 SQL 中执行类似下面的操作。

假设您有三个表。 Field Id是贯穿所有数据库的关系键

Table1 - PK Id, .... 
Table2 - PK Id, T3FK, TimeStamp,....
Table3 - PK Id, identity, Status, ....

Table1.id (1 to *) Table 2.id
Table1.id (1 to *) Table 3.id
Table2.id+Table2.T3FK (1 to *) Table3.Id+Table3.identity

我正在尝试组合以下选择语句:

SELECT T1.*, T2.* 
  FROM Table1 T1
  JOIN Table2 T2 ON T1.Id = T2.Id
  JOIN Table3 T3 on T1.Id = T3.Id
 WHERE T3.Status = 'A' 
   AND T2.P3Fk = T3.identity 
   AND T1.id IN (SELECT Id 
                   FROM ListOfIds)

...和:

SELECT T1.*, T2.* 
  FROM Table1 T1
  JOIN Table2 T2 ON T1.id = T2.id
  JOIN (SELECT id, MAX(TimeStamp) as TimeStamp 
          FROM Table2 
      GROUP BY id) t2a ON t2.id = t2a.id 
                      AND t2.TimeStamp = t2a.TimeStamp
 WHERE t1.Id IN (SELECT Id 
                   FROM ListOfIds)

所以基本上我想做的是有一个返回的选择语句 T2 中的行,其中 T2.P3FK = T3.identity 和 T3.status = 'A' 如果不存在则 返回 T2 中具有最新时间戳的行。我需要对 ID 列表以及不仅仅是一个 ID 执行此操作。

最佳答案

可能最简单的方法是将 JOIN 修改为 T2 和 T3,并将 JOIN 添加到 t2a,然后在 T2 中您需要的所有字段上使用 case 或 coalesce。

SELECT T1.*, 
   COALESCE(T2.id,t2a.id) id,
   COALESCE(...
  FROM Table1 T1
  LEFT JOIN (Table2 T2
     INNER JOIN Table3 T3 on T1.Id = T3.Id
             and  T3.status = 'A' )
   ON T1.Id = T2.Id
  INNER JOIN (SELECT id, MAX(TimeStamp) as TimeStamp 
          FROM Table2 
      GROUP BY id) t2a ON t2.id = t2a.id 
                      AND t2.TimeStamp = t2a.TimeStamp
 WHERE t1.Id IN (SELECT Id 
                   FROM ListOfIds)

关于SQL有条件地选择一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6698612/

相关文章:

sql - 在 DuckDB 中创建一个自增主键

sql - PostgreSQL 不接受 WHERE 子句中的列别名

sql - 如何从 SQL Server 存储过程捕获打印消息?

sql - CASE 语句和 DECODE 是否等效?

MySQL - 先按字母顺序排列字段,然后按小数点排列

mysql 只选择具有一定长度的组

mysql - 如果一个表为空或没有数据,如何使用 INNER JOIN

sql - 在 Oracle SQL 中创建并填充 Varray

php - 错误的整数值 : '' for column 'height' at row 1

mysql - 嵌套选择 - SQL 查询