2014-02-11 18 views
0

最新记录我有两个表的员工和交易:我想在SQL

员工: enter image description here

横贯:

enter image description here

现在我想通过最新的记录来自交易的日期,其中该记录具有解除标记为0,并且交易中的雇员应该等于雇员表中的雇佣合同。

输出:

1497163 SKANNAN27 0 2012-02-08 19:13:33.840

1498704 AETHODE 0 2012-02-08 18:45:08.380

我不会得到其他记录因为对于其他记录,如果我们采用最大的transdate记录,它们的执行标记为'1'。如上面的输出,我有许多记录应该检索所有。

请指导我如何实现这一目标。

+0

我不确定确切的SQL Server语法是什么,但是您可以通过“Order by TransDate DESC LIMIT 1”获取最新记录。 –

+0

@ChrisForrence LIMIT 1是MySQL语法,在SQL Server中使用'SELECT'子句中的'Top 1'。 – FrankPl

+0

@FrankPl - 啊,谢谢。现在我很高兴我没有做出答案,是错的;) –

回答

3

若要获取Trans表最新TransDateSQL Fiddle)的最后一个记录:

SELECT TOP(1) e.EmployeeID, e.EmpShortID, t.ExecutionFlag, t.TransDate 
FROM Employee AS e 
INNER JOIN Trans AS t ON t.Employee = e.EmpShortID 
WHERE t.ExecutionFlag = 0 
ORDER BY t.TransDate DESC 

编辑,拿到最后一个记录在Trans表对每个员工的最新TransDateSQL Fiddle ):

SELECT e.EmployeeID, e.EmpShortID, t.ExecutionFlag, MAX(t.TransDate) 
FROM Employee AS e 
INNER JOIN Trans AS t ON t.Employee = e.EmpShortID 
WHERE t.ExecutionFlag = 0 
GROUP BY e.EmployeeID, e.EmpShortID, t.ExecutionFlag 

EDIT,下面的QUER y检索Trans表中的最后一条记录,其中最新的TransDate表示每位员工,而不考虑ExecutionFlag。然后,它需要这些结果和拉只记录其中ExecutionFlag =0SQL Fiddle):

SELECT m.* 
FROM 
(
    SELECT e.EmployeeID, e.EmpShortID, MAX(t.TransDate) AS MaxTransDate 
    FROM Employee AS e 
    INNER JOIN Trans AS t ON t.Employee = e.EmpShortID 
    GROUP BY e.EmployeeID, e.EmpShortID 
) AS m 
INNER JOIN Trans AS tm ON 
m.EmpShortID = tm.Employee AND 
m.MaxTransDate = tm.TransDate 
WHERE tm.ExecutionFlag = 0 
+0

如果我选择top 1它只给我一个记录,但在我的表首先我有一个员工的记录,后来有一些记录与其他员工。请检查我编辑的职位。 – user1912987

+0

*** @ user1912987 ***,我修改了我的答案,我想你在找什么。它为每个“员工”找到最新的'TransDate',其'ExecutionFlag'为'0'。 – Linger

+0

编辑后的答案看起来像更改要求后OP正在寻找的内容。 – TTeeple

1

非常简单的查询。假定dbo架构:

SELECT TOP 1 * 
FROM dbo.Transaction T 
INNER JOIN dbo.Employee E 
ON T.Employee = E.EmpshortID 
WHERE T.ExecutionFlag = 0 
ORDER BY T.TransDate DESC 

请参阅SQLFiddle

编辑:改变每个员工:

SELECT * 
FROM dbo.Transaction T 
INNER JOIN dbo.Employee E 
ON T.Employee = E.EmpshortID 
WHERE T.ExecutionFlag = 0 
ORDER BY T.TransDate DESC 
+0

在事务表中我有很多记录与同一个员工和不同的执行标志..我只想得到一个记录与最大transdate和检查最大传输日期列是否有执行标志0 – user1912987

+0

有'WHERE'子句将只拉行有一个执行标志为0.'TOP 1'只会拉一条记录。这将是最近的交易记录,因为'ORDER BY'是'DESC'的顺序。您的所有要求都已满足此查询。 – TTeeple

+0

但我需要得到相同的所有短ID ...请检查我编辑的职位,它可能会让你更好地了解 – user1912987

0
SELECT TOP 1 
    * 
FROM Employee AS emp 
INNER JOIN Transaction AS tran 
    ON tran.Employee = emp.EmpShortID 
WHERE tran.ExecutionFlag = 0 
ORDER BY TransDate DESC 
0

事端这样呢?

Select top1 from Employee, Transaction 
    where Employee.EmployeeID = Transaction.EmployeeID 
    and ExecutionFlag=0 
    order by TransDate desc; 
+0

我不能做顺序,因为我想只检索一个记录与短ID和该记录应该有最大日期和需要检查记录执行标志 – user1912987

+0

@Servantwriter,你的答案看起来不正确。 OP声明'Employee'表中的EmpShortID应该等于'Transaction'表中的'Employee'。 – Linger

+0

我认为外键等没有关系。整个逻辑必须是正确的。你必须按顺序排列并获得第一个结果。您可以通过TransDate,short_id进行订购 – Servantwriter