2017-04-04 100 views
0

我有一个数据库与多个表,即table1,table2,table3具有相同的字段。不知何故,我无法将这些表合并成一个。Sql搜索多个表

有没有什么办法可以按照相同的标准一个接一个地查询它们,例如,如果在第一个表中找到记录,则返回找到的记录,否则在第二个表中搜索依此类推。 像:

Select * from table1 where cloumnX = 'xyz' 
if found return the rocord 
else 
Select * from table2 where cloumnX = 'xyz' 
... 

Select * from lastTable where cloumnX = 'xyz' 
+3

如果你有这样的枚举表,你应该考虑修复你的模式设计。 – GurV

+0

你可以使用'UNION' – Stephen

+1

你能描述你为什么要这样做吗?我有一种感觉,有一种比你想象的更好的方式。 – user3685285

回答

1

我不知道什么是你想要的输出,但你可以给一个去下面:

if exists (Select 1 from table1 where cloumnX = 'xyz') 
    Select * from table1 where cloumnX = 'xyz' 
else if exists (Select 1 from table2 where cloumnX = 'xyz') 
    Select * from table1 where cloumnX = 'xyz' 
else if exists (Select 1 from table3 where cloumnX = 'xyz') 
    Select * from table3 where cloumnX = 'xyz' 
else 
    print 'no records returned from tables' 

或在评论中提到的,使用UNION,但你要记住约:

“使用UNION组合的所有查询,交叉或EXCEPT运算符必须 在其目标列表中表达了相同数量的”

Select * from table1 where cloumnX = 'xyz' 
union 
Select * from table2 where cloumnX = 'xyz' 
union 
Select * from table3 where cloumnX = 'xyz' 
+0

关于你的第二个答案,使用联合的答案: 虽然你的查询会加入表格,但它不能回答问题的第二部分,并且它可能会从第二个表格第一个返回记录 – Eli

+0

@Eli,I我完全意识到这一点,但是我们不确定OP想要什么,并且似乎并不知道这些答案是否已被他接受,甚至是由他提出来...... – PawelCz

1

假设你问其实你需要做的是,这应该这样做:

SET NOCOUNT ON 
SELECT * 
INTO #table 
FROM table1 
WHERE cloumnX = 'xyz' 

IF @@ROWCOUNT = 0 
BEGIN 

    INSERT INTO #table 
    SELECT * 
    FROM table2 
    WHERE cloumnX = 'xyz' 

    IF @@ROWCOUNT = 0 
    BEGIN 
     INSERT INTO #table 
     SELECT * 
     FROM table3 
     WHERE cloumnX = 'xyz' 
    END 
END 

SELECT * 
FROM #table 

这就是说,你可能能够做到这一点更优化地使用其他技术。例如,上面提到的UNION可以工作,但是如果对于给定的键值,不同的行可以位于多个表中,则需要为ORDER BY包含一个字段,并在SELECT语句中使用TOP 1来执行你问。

+0

谢谢亲爱的,看起来就是这样我想要。我有一些旧的记录和一些新的记录,所有的领域相同的表。新表格不是全新的,而是更新的。首先我想在新表中搜索一条记录,如果找到,我会使用它。否则我会在旧表中搜索它。出于某种原因,我不想合并表并删除相同的记录,这就是为什么我需要这样查询它。 –

1

穆罕默德,

我将在这里与许多人的同意,这看起来像有空间模式设计改进;但是,我确实想以一种相当简单的方式对所问的问题提出建议。
您可以在此处将联合所有查询(联合会消除空值),并向其添加“排名”并选择排名前1.请参阅下面的示例。

select top 1 cloumnX from (
select 1 as ranked, * from table1 where cloumnX = 'xyz' union all      
select 2 as ranked, * from table2 where cloumnX = 'xyz' union all      
select 3 as ranked, * from table3 where cloumnX = 'xyz' 
)a 
order by ranked 

同样,虽然这可能会在短期内解决你的问题,你需要重新考虑你的方案,如果这是您遇到什么。