2013-12-04 4 views
1

У меня есть два (связанных) SQL-сервера с одинаковой настройкой, но они различаются по содержанию. То, что я хочу сделать, это взять 2 таблицы (по одному от каждого сервера) и объединить их, так что нет дубликатов ID (например, не дублировать fname) и что чем count складываются вместеОбъединить значения двух таблиц с разных SQL-серверов

Они могут выглядеть

SERV1.DB1.dbo.Table: 
| fname  | count | 
---------------------- 
| 'file1.txt' | 10 | 
| 'file2.txt' | 5  | 
| 'file3.txt' | 35 | 


SERV2.DB2.dbo.Table: 
| fname  | count | 
---------------------- 
| 'file1.txt' | 40 | 
| 'file2.txt' | 150 | 

и я хочу написать select, который выводит

| fname  | count | 
---------------------- 
| 'file1.txt' | 50 | 
| 'file2.txt' | 155 | 
| 'file3.txt' | 35 | 

Я не хочу, объединение и объединение не сливать их так, как я хочу.

редактировать

  • Это должно быть нечувствительны к регистру, как fname может (читай: будет) меняться в случае
  • fname имеет разные параметры сортировки (это не будет никаких проблем, но стоит отметить)
  • Я получаю эти две таблицы, выполняя аналогичные select на каждом сервере. Я мог бы создавать временные таблицы, но я бы предпочел, если бы у меня тоже не было.
+0

«Я не хочу присоединиться» - почему бы и нет? Простая и очевидная вещь - полное внешнее соединение –

+0

@Damien_The_Unbeliever, потому что я думал, что соединение не объединит мои таблицы так, как я их тоже хотел. – user1021726

ответ

2

Вы можете сделать это Исли с JOIN

SELECT table1.fname fname, table1.Count + table2.count Count 
FROM SERV1.DB1.dbo.Table table1 
    FULL OUTER JOIN SERV2.DB2.dbo.Table table2 ON table1.fname=table2.fname 

EDIT: чувствителен к регистру/нечувствительными к регистру depends on the column collation

+0

Спасибо, это было намного проще, чем я думал, ха-ха. – user1021726

+0

@ user1021726: D рад помочь! посмотрите, что нужно левое соединение! – giammin

+0

Я бы рекомендовал полное внешнее соединение, а не левое, если есть имена, которые отображаются в таблице 2, а не в таблице 1, которые также должны появляться в результатах. Вам также понадобится некоторая «COALESCE» любовь в предложении SELECT, чтобы убедиться, что вы получили имя и чтобы '+' был защищен от 'NULL'. –

1

Это моя собственная рекомендация, основанная на ответе giammin в:

SELECT 
    COALESCE(t1.fname,t2.fname) fname, 
    COALESCE(t1.Count,0) + COALESCE(t2.count,0) Count 
FROM 
    SERV1.DB1.dbo.Table t1 
    FULL OUTER JOIN 
    SERV2.DB2.dbo.Table t2 
    ON t1.fname=t2.fname 

который гарантирует, что всеВ результате появляются значенияиз обеих таблиц, даже те, которые отображаются только в таблице SERV2.

+0

Кажется, что это работает greate. Спасибо за помощь! – user1021726

Смежные вопросы