在多个表中进行SQL搜索

时间:2017-04-04 15:58:49

标签: sql sql-server

我有一个包含多个表的数据库,即table1,table2,table3,具有相同的字段。不知怎的,我无法将这些表合并为一个。

有没有办法一个接一个地查询它们以获得相同的条件,这样如果在第一个表中找到记录,则返回找到的记录,否则在第二个表中搜索,依此类推。 像:

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 个答案:

答案 0 :(得分: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,INTERSECT或EXCEPT运算符组合的所有查询都必须   在目标列表中有相同数量的表达式“

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

答案 1 :(得分: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来做什么你问。

答案 2 :(得分:1)

穆罕默德,

我将同意这里的许多其他人,这看起来似乎在架构设计方面有改进的余地;但是,我确实想以一种相当简单的方式对所提出的问题提出建议。
您可以在此处获取union all查询(union将消除空值),并为其添加“rank”并选择顶部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 

同样,虽然这可能会在短期内解决您的问题,但如果您遇到这种情况,则需要重新考虑您的架构。