Слияние двух таблиц - PullRequest
3 голосов
/ 31 июля 2009

У меня есть две таблицы со следующими столбцами (одинаковые столбцы в обеих таблицах):

  1. FunctionName,
  2. FrequencyCount

Я хочу объединить эти две таблицы в окончательную таблицу со столбцами:

  1. Имя функции
  2. Подсчет базовой частоты
  3. Сравнение частот
  4. Дельта Частоты

Операция слияния должна выполняться следующим образом:

  • Если [FunctionName] находится в Таблице1, а НЕ в Таблице2,

    [Base Frequency Count] = Table1.[FrequencyCount]
    [Compared Frequency Count] = 0
    [Delta of Frequency Count] = Table1.[FrequencyCount]
    
  • Если [FunctionName] находится в таблице 2, а НЕ в таблице 1,

    [Base Frequency Count] = 0         
    [Compared Frequency Count] = Table2.[FrequencyCount]
    [Delta of Frequency Count] = Table2.[FrequencyCount]
    
  • Если [FunctionName] находится в Таблица1 и Таблица2,

    [Base Frequency Count] = Table1.[FrequencyCount]         
    [Compared Frequency Count] = Table2.[FrequencyCount]
    [Delta of Frequency Count] = Table1.[FrequencyCount]-Table2.[FrequencyCount]
    

Желательно, чтобы запрос имел хорошую производительность при минимальном нет. объединений. Было бы здорово, если бы кто-то мог дать хорошие советы.

Ответы [ 3 ]

2 голосов
/ 01 августа 2009
SELECT ISNULL(fn.FunctionName, fc.FunctionName) AS FunctionName, 
       ISNULL(fn.FrequencyCount, 0) AS BaseFrequency,
       ISNULL(fc.FrequencyCount, 0) AS ComparedFrequencyCount,
       COALESCE((fn.FrequencyCount - fc.FrequencyCount), fn.FrequencyCount, fc.FrequencyCount) AS DeltaOfFrequencyCount
INTO FinalTable
FROM FunctionName fn FULL OUTER JOIN FrequencyCount fc ON fn.FunctionName = fc.FunctionName

Обратите внимание, что COALESCE приведет к нулю в первом выражении (переходя к следующему в цепочке), если либо fn.FrequencyCount, либо fc.FrequencyCount равен нулю (в SQL значение - null = null).

1 голос
/ 31 июля 2009
SELECT *
  INTO new_table_name 
  FROM (SELECT t.frequencycount 'Base Frequency Count',
               0 'Compared Frequency Count',
               t.frequencycount 'Delta of Frequency Count'
          FROM TABLE1 t
          JOIN TABLE2 t2 ON t2.functionname != t.functionname
        UNION
        SELECT 0 'Base Frequency Count',
               t2.frequencycount 'Compared Frequency Count',
               t2.frequencycount 'Delta of Frequency Count'
          FROM TABLE2 t2
          JOIN TABLE1 t ON t.functionname != t2.functionname
        UNION
        SELECT t.frequencycount 'Base Frequency Count',
               t2.frequencycount 'Compared Frequency Count',
               t.frequencycount - t2.frequencycount 'Delta of Frequency Count'
          FROM TABLE1 t
          JOIN TABLE2 t2 ON t.functionname = t2.functionname)
0 голосов
/ 31 июля 2009

Не уверен, что это будет медленнее, чем решение Rexem (я не тестировал его). Но это может быть легче для вас, чтобы прочитать. Также можно значительно повысить производительность, выбирая на основе первичных ключей вместо FunctionName.

--TABLE 1
SELECT FunctionName, FrequencyCount AS Base, 0 AS Compared, FrequencyCount AS Delta
FROM TableOne
WHERE FunctionName NOT IN (SELECT FunctionName FROM TableTwo)
UNION

--TABLE 2
SELECT FunctionName, 0 AS Base, FrequencyCount AS Compared, FrequencyCount AS Delta
FROM TableTwo
WHERE FunctionName NOT IN (SELECT FunctionName FROM TableOne)
UNION

--DELTA
SELECT FunctionName, 
(SELECT FrequencyCount FROM TableOne WHERE FunctionName = DeltaTable.FunctionName) AS Base,
(SELECT FrequencyCount FROM TableTwo WHERE FunctionName = DeltaTable.FunctionName) AS Compared,
(SELECT FrequencyCount FROM TableOne WHERE FunctionName = DeltaTable.FunctionName) - (SELECT FrequencyCount FROM TableTwo WHERE FunctionName = DeltaTable.FunctionName) AS Delta
FROM TableOne DeltaTable
WHERE FunctionName IN (SELECT FunctionName FROM TableOne)
AND FunctionName IN (SELECT FunctionName FROM TableTwo)

Модифицированная Дельта

--DELTA
SELECT One.FunctionName, 
One.FrequencyCount AS Base,
Two.FrequencyCount AS Compared,
One.FrequencyCount - Two.FrequencyCount AS Delta
FROM TableOne One
INNER JOIN TableTwo Two
    ON One.FunctionName = Two.FunctionName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...