我想知道是否可以在SQL中执行以下操作。
假设你有三张桌子。 字段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语句:
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)
所以基本上我要做的是有一个返回的select语句
T2 where T2.P3FK = T3.identity and T3.status = 'A'
中的行,如果那不存在则
返回T2中具有最新时间戳的行。我需要为id列表执行此操作,而不仅仅是一个id。
答案 0 :(得分:2)
最简单的方法可能是将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)
答案 1 :(得分:0)
我很难理解这个问题,但是如果你需要返回不同的数据,可以将CASE语句放入SQL(取决于你的数据库),根据条件返回不同的字段。
您可能需要根据数据库查找准确的详细信息。