我有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
我希望我对你很清楚。请帮帮我谢谢
答案 0 :(得分:1)
您可以添加任意列以指定优先级。
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