Tsql 标识从中检索的表数据

Tsql 标识从中检索的表数据,tsql,union,inner-join,Tsql,Union,Inner Join,我有一个典型的问题 我需要修改下面的T SQL查询。目前它只在一个表中查找信息。我需要查看两个具有相同列的表以获取信息。一个表包含当前员工,一个表包含以前的员工 SELECT t.net_Id ,e.fname ,e.lname FROM tblTrackingEmployee t join view_employee e on e.net_id = t.net_id where trackingid = @trackingId and empT

我有一个典型的问题

我需要修改下面的T SQL查询。目前它只在一个表中查找信息。我需要查看两个具有相同列的表以获取信息。一个表包含当前员工,一个表包含以前的员工

SELECT t.net_Id
      ,e.fname
      ,e.lname
FROM tblTrackingEmployee t
    join view_employee e 
        on e.net_id = t.net_id
where trackingid = @trackingId
and empType = @empType
我想做的是用一个工会来审视两者。一个员工要么出现在一个表中,要么出现在另一个表中,它永远不会同时出现在两个表中

SELECT t.net_Id
      ,e.fname
      ,e.lname
FROM tblTrackingEmployee t
    JOIN view_employee e
        ON e.net_id = t.net_id
WHERE trackingid = @trackingId
AND empType = @empType
union 
SELECT t.net_Id
      ,fe.fname
      ,fe.lname
FROM tblTrackingEmployee t
      JOIN view_employee fe 
             ON fe.net_id = t.net_id
WHERE trackingid = @trackingId
AND empType = @empType

然而,这里有一个转折点,我需要知道返回的人员是现任还是前任员工。是否有方法向返回的表中添加列,如果该列是当前员工,则该列的值为1;如果该列是以前的员工,则该列的值为0?每个trackingId可能包含两种类型的员工。

为每个
SELECT
子句添加一个常量列-您可以将其别名为:

SELECT t.net_Id
      ,e.fname
      ,e.lname
      ,'Current' AS Type
FROM tblTrackingEmployee t
    JOIN view_employee e
        ON e.net_id = t.net_id
WHERE trackingid = @trackingId
AND empType = @empType
union 
SELECT t.net_Id
      ,fe.fname
      ,fe.lname
      ,'Former'
FROM tblTrackingEmployee t
      JOIN view_formerEmployee fe 
             ON fe.net_id = t.net_id
WHERE trackingid = @trackingId
AND empType = @empType

在每个
SELECT
子句中添加一个常量列-您可以将其别名为:

SELECT t.net_Id
      ,e.fname
      ,e.lname
      ,'Current' AS Type
FROM tblTrackingEmployee t
    JOIN view_employee e
        ON e.net_id = t.net_id
WHERE trackingid = @trackingId
AND empType = @empType
union 
SELECT t.net_Id
      ,fe.fname
      ,fe.lname
      ,'Former'
FROM tblTrackingEmployee t
      JOIN view_formerEmployee fe 
             ON fe.net_id = t.net_id
WHERE trackingid = @trackingId
AND empType = @empType

让我直说吧,你们有两张桌子,一张是现任员工,一张是前任员工?这是一个坏主意,您本来可以有一个状态为“活动”/“非活动”的表。在任何情况下,只需在每个查询中添加一个字段,如
int

SELECT
 0 AS TheField,
  ....
FROM
  Table
UNION ALL
SELECT
1 AS TheField,
 ...
FROM
  table

让我直说吧,你们有两张桌子,一张是现任员工,一张是前任员工?这是一个坏主意,您本来可以有一个状态为“活动”/“非活动”的表。在任何情况下,只需在每个查询中添加一个字段,如
int

SELECT
 0 AS TheField,
  ....
FROM
  Table
UNION ALL
SELECT
1 AS TheField,
 ...
FROM
  table

如果您愿意,还可以按状态进行排序:

 SELECT U.* FROM
 (
  SELECT t.net_Id AS ID
      ,e.fname AS FName
      ,e.lname AS LName
      ,'Current' AS EmployStatus
  FROM tblTrackingEmployee t
      JOIN view_employee e
          ON e.net_id = t.net_id
  WHERE trackingid = @trackingId
  AND empType = @empType
  union 
  SELECT t.net_Id AS ID
      ,fe.fname AS FName
      ,fe.lname AS LName
      ,'Former' AS EmployStatus
  FROM tblTrackingEmployee t
        JOIN view_formerEmployee fe
               ON fe.net_id = t.net_id
  WHERE trackingid = @trackingId
    AND empType = @empType
) AS U
 ORDER BY U.EmployStatus

如果您愿意,还可以按状态进行排序:

 SELECT U.* FROM
 (
  SELECT t.net_Id AS ID
      ,e.fname AS FName
      ,e.lname AS LName
      ,'Current' AS EmployStatus
  FROM tblTrackingEmployee t
      JOIN view_employee e
          ON e.net_id = t.net_id
  WHERE trackingid = @trackingId
  AND empType = @empType
  union 
  SELECT t.net_Id AS ID
      ,fe.fname AS FName
      ,fe.lname AS LName
      ,'Former' AS EmployStatus
  FROM tblTrackingEmployee t
        JOIN view_formerEmployee fe
               ON fe.net_id = t.net_id
  WHERE trackingid = @trackingId
    AND empType = @empType
) AS U
 ORDER BY U.EmployStatus

当我添加“Type”行时,返回的结果是原来的两倍。一套带电流,一套带电流identical@Mike-真奇怪。您是否也添加了
'Former'
行?我发现了错误。当我把代码放上去时,我忘了做第二个视图“查看员工fe”“你写的方式没有我的打字错误。谢谢当我添加“Type”行时,返回的结果是原来的两倍。一套带电流,一套带电流identical@Mike-真奇怪。您是否也添加了
'Former'
行?我发现了错误。当我把代码放上去的时候,我忘了让第二个视图“view_FormereEmployee fe”按照你写的方式工作,没有我的打字错误。谢谢!当我添加“Employee Status”行时,我得到的结果是原来的两倍。一个是当前的,一个是前一个,它们是相同的。我们的表是相同的(tblTrackingEmployee)在两个选项中,我都不知道“前者”的表格“雇员。你需要修改你的问题。实际上我自己刚刚发现了那个错误。有了这个固定装置,它就可以正常工作了。然而,我选择@Oded’s作为答案,因为他首先发布了他的解决方案。我真的很感谢大家的快速反应@迈克,没问题。在第二次选择中,我还是用以前的employee表更新了我的答案。当我添加“EmployStatus”行时,返回的结果是原来的两倍。一组当前和一组前者是相同的。我们的表在两个选择中是相同的(tblTrackingEmployee)。我不知道“前”雇员的名单。你需要修改你的问题。实际上我自己刚刚发现了那个错误。有了这个固定装置,它就可以正常工作了。然而,我选择@Oded’s作为答案,因为他首先发布了他的解决方案。我真的很感谢大家的快速反应@迈克,没问题。在第二次选择中,我还是用以前的employee表更新了我的答案。我会添加一个字段,而不是简单的active/inactive,它会显示员工开始和结束的日期。如果它们处于活动状态,则完成日期将为空。这上面有很多排列。谢谢你的建议,但不幸的是,这些表格不是我可以更改的。我只需要处理他们设置的内容。我会添加一个字段,显示员工开始和结束的日期,而不仅仅是活动/非活动。如果它们处于活动状态,则完成日期将为空。这上面有很多排列。谢谢你的建议,但不幸的是,这些表格不是我可以更改的。我只需要和他们合作。