2011-07-14 89 views
3

我想知道是否可以在SQL中执行类似下面的操作。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 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。

+1

对于什么数据库? –

回答

2

也许最简单的方法是将JOIN修改为T2和T3,并将JOIN添加到t2a,然后使用任意一种情况或在T2中需要的所有字段上合并。

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) 
+0

谢谢康拉德!我用你所说的话,它就像一个魅力。我感谢您的帮助。我需要15点的信誉来upvote,但我会,当我得到的。谢谢 – crsavage0630

+0

@ crsavage0630很高兴能帮到你。既然你提到过它,你可能想看看Meta上的[接受答案如何工作?](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work),而不是我游说你接受我的答案;) –

0

我很努力的去理解这个问题,但是如果你需要返回不同的数据,你可以把CASE语句放入SQL中(取决于你的数据库),根据条件返回不同的字段。

您可能需要根据您的数据库查找确切的详细信息。