在Satement中使用SubQuery

时间:2015-07-22 18:21:21

标签: sql tsql

我的任务是创建一个查询,从今天开始提取员工信息。现在我有测试数据,为下面的每个条件返回一条记录。如果子查询返回多条记录怎么办?有没有更好的方法来写这个?

查询Employee_Master。

我需要显示名称,ID,类型和日期。

Type将成为case语句创建的列。

当Start_Date = Today_Date时,

'NEW' Terminate_Date = Today_Date时'TERMINATED' 'EXTENDED'当Start_Date<> Today_Date和Terminate_Date<> Today_Date时,employee_reference表中存在相同的记录,代表今天的日期。 如果用户是'EXTENDED'并且存在于Name_Change表

中,则“NAME CHANGED”
SELECT Name, ID, Date,
Type = CASE
WHEN Start_Date = Today_Date THEN 'NEW'
WHEN Terminate_Date = Today_Date THEN 'TERMINATED'
WHEN ID = (SELECT A.ID FROM Employee_Master AS A
INNER JOIN Employee_Reference AS B on B.ID = A.ID
WHERE DATE = GETDATE()) THEN 'EXTENDED'
WHEN ID = (SELECT A.ID FROM Employee_Master AS A
INNER JOIN Name_Change AS B ON B.ID = A.ID 
WHERE Create_Date = GETDATE()) THEN 'Name Changed'
END
FROM Employee_Master
WHERE Today_Date = GETDATE()

1 个答案:

答案 0 :(得分:0)

我不完全确定你的所有日期在子选择中的来源,因为它们没有别名,但概念上我会尝试:

@interface MyObject : NSObject
@property (nonatomic, readonly) NSNumber *hash;
@end

@implementation MyObject
@synthesize hash = _hash;
@end

基本上,这消除了employee_master中额外选择的ID,因为您已经从中进行选择,并从子选择中的目标表中选择最大日期。你只会以这种方式得到一个,如果它符合今天的日期,那么它将满足案例陈述。

请注意,上面假设您的原始查询获得了整个人口。但是,我怀疑您可能希望在FROM语句中实际包含employee_reference和name_change作为外连接,然后从WHERE语句中的当前日期过滤到所有内容 - 例如:

SELECT 
    Name, 
    ID, 
    Date,
    Type = CASE
            WHEN Start_Date = Today_Date THEN 'NEW'
            WHEN Terminate_Date = Today_Date THEN 'TERMINATED'
            WHEN (SELECT MAX(DATE)
                    FROM Employee_Reference ER on ER.ID = EM.ID) = GETDATE() THEN 'EXTENDED'
            WHEN ID = (SELECT MAX(Create_Date)
                        FROM Name_Change AS NC ON NC.ID = EM.ID) = GETDATE() THEN 'Name Changed'
           END
FROM Employee_Master EM
WHERE Today_Date = GETDATE()