2017-04-04 95 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 

同樣,雖然這可能會在短期內解決你的問題,你需要重新考慮你的方案,如果這是您遇到什麼。