如何编写可以从4个表中的任何一个表中得到结果的SQL Server查询

时间:2015-04-23 04:57:24

标签: sql sql-server

我有4个表(比如emp1,emp2,emp3,emp4),列几乎相同。我想获取详细信息

(select empid, empname from emp1 where empid = '1' )
UNION
(select empid, empname from emp2 where empid = '1')
UNION
(select empid, empname from emp3 where empid = '1')
UNION
(select empid, empname from emp4 where empid = '1')

问题是,如果我从第一个查询(emp1)得到结果,它应该忽略下面的查询(emp2,emp3,emp4)。如果我从emp2得到一个结果,它应该忽略(emp3,emp4)等等。

请记住,在emp1,emp2,emp3,emp4中,与同一empname相关联的empid不同。这就是工会给出所有结果的原因。在那种情况下,我必须更喜欢最上层表格的结果,即emp1> emp2> EMP3。我也尝试过使用' case'但事情对我不起作用。

示例数据

EMP1

1    deepak

EMP2

1    nitin

emp3

1    sateesh

emp4

1    chandra

,预期结果是

1 deepak

我希望我对你很清楚。请帮帮我谢谢

3 个答案:

答案 0 :(得分:1)

您可以添加任意列以指定优先级。

SQL Fiddle

java.util.logging

基本上,您希望优先处理来自;WITH Cte AS( SELECT *, N = 1 FROM emp1 WHERE empId = 1 UNION ALL SELECT *, N = 2 FROM emp2 WHERE empId = 1 UNION ALL SELECT *, N = 3 FROM emp3 WHERE empId = 1 UNION ALL SELECT *, N = 4 FROM emp4 WHERE empId = 1 ) ,CteRN AS( SELECT *, RN = ROW_NUMBER() OVER(ORDER BY N) FROM Cte ) SELECT empId, empName FROM CteRN WHERE RN = 1 ,然后emp1等的结果。这是任意列emp2的来源。您希望按优先级顺序排名。第一次CTE的结果是:

N

然后使用ROW_NUMBER为每行添加序号。第二个CTE,empId empName N ----------- ---------- ----------- 1 deepak 1 1 nitin 2 1 sateesh 3 1 chandra 4 会给你:

CteRN

Laslt,您只需要empId empName N RN ----------- ---------- ----------- -------- 1 deepak 1 1 1 nitin 2 2 1 sateesh 3 3 1 chandra 4 4 行最少的行,因此您需要添加RN子句。最终结果将是:

WHERE RN = 1

此外,您可以在empId empName ----------- ---------- 1 deepak

上添加PARTITION BY empId

答案 1 :(得分:0)

根据您更新的问题,因为不应该从其他表重复使用empid,您可以尝试这样的事情。

select empid,empname 
from emp1
UNION ALL

select empid,empname 
from emp2 e 
WHERE NOT EXISTS( SELECT empid FROM emp1 ee WHERE ee.empid = e.empid)
UNION ALL

select empid,empname 
from emp3 e
WHERE NOT EXISTS( SELECT empid FROM emp1 ee WHERE ee.empid = e.empid)
    AND NOT EXISTS( SELECT empid FROM emp2 ee WHERE ee.empid = e.empid)
UNION ALL

select empid,empname from emp4 e
WHERE NOT EXISTS( SELECT empid FROM emp1 ee WHERE ee.empid = e.empid)
    AND NOT EXISTS( SELECT empid FROM emp2 ee WHERE ee.empid = e.empid)
    AND NOT EXISTS( SELECT empid FROM emp3 ee WHERE ee.empid = e.empid)

答案 2 :(得分:0)

This isn't pretty, but it works.

INSERT INTO emp3
SELECT 1, 'pwalton'

INSERT INTO emp4
SELECT 2, 'jimmy'

DECLARE @myTable TABLE (empid INT, empname VARCHAR(255))

INSERT INTO @myTable
SELECT empid, empname FROM emp1

IF NOT EXISTS (SELECT 1 FROM @myTable)
BEGIN
    INSERT INTO @myTable
    SELECT empid, empname FROM emp2
END

IF NOT EXISTS (SELECT 1 FROM @myTable)
BEGIN
    INSERT INTO @myTable
    SELECT empid, empname FROM emp3
END

IF NOT EXISTS (SELECT 1 FROM @myTable)
BEGIN
    INSERT INTO @myTable
    SELECT empid, empname FROM emp4
END

SELECT * FROM @myTable
--results: 1    pwalton