2011-02-15 1 views
0

У меня есть 2 таблицы с большим количеством данных, которые мне нужно присоединиться. Проблема в том, что две таблицы содержат в основном одни и те же данные, а соединение иногда создает нежелательные, хотя и не неожиданные. Результаты. Вот пример:Соедините 2 записи в 1 таблице с 2 записями в другой таблице, чтобы создать 2 записи

week_end_date nugly payroll_code rate  hours  check_number 
-------------------------------------------------------------- 
2010-01-17  AU9T8K HRLY-W  13.00000 40.00000 530957    
2010-01-17  AU9T8K HRLY-W  13.00000 40.00000 DD00000105382 

week_end_date nugly trx_number pay_code hours rate 
2010-01-17 AU9T8K ETS00000010771815 HRLY-W 40.00000 13.00000 
2010-01-17 AU9T8K ETS00000010771684 HRLY-W 40.00000 13.00000 

Я ищу в проверочной # и trx_number объединены в объединение, но я в конечном итоге с крестом присоединиться, потому что все то же самое, что я присоединяюсь на. Для каждого случая у меня это так, мне действительно все равно, что trx_number заканчивается тем, что проверит #.

Любые мысли?

Вот текущие результаты:

week_end_date nugly payroll_code rate hours check_number trx_number 
2010-01-17 AU9T8K HRLY-W 13.00000 40.00000 DD00000105382   ETS00000010771815 
2010-01-17 AU9T8K HRLY-W 13.00000 40.00000 530957     ETS00000010771815 
2010-01-17 AU9T8K HRLY-W 13.00000 40.00000 DD00000105382   ETS00000010771684 
2010-01-17 AU9T8K HRLY-W 13.00000 40.00000 530957     ETS00000010771684 

То, что я хотел бы является:

week_end_date nugly payroll_code rate hours check_number trx_number 
2010-01-17 AU9T8K HRLY-W 13.00000 40.00000 DD00000105382   ETS00000010771815 
2010-01-17 AU9T8K HRLY-W 13.00000 40.00000 530957     ETS00000010771684 

Где я на самом деле не важно, который trx_number является, с которой check_number.

Вот мой текущий запрос:

SELECT c.week_end_date, c.nugly, c.payroll_code, c.rate, c.hours, c.check_number, t.trx_number 
    FROM checksByNuglyPaycode c 
    LEFT OUTER JOIN trxNumByNuglyPaycode t ON c.db_id = t.db_id AND c.fridate = t.fridate 
     AND c.nugly = t.nugly AND c.trx_type = t.trx_type AND c.payroll_code = t.pay_code 
     AND c.hours = t.hours AND c.rate = t.rate AND c.week_end_date = t.week_end_date 
    WHERE t.db_id = 'lal' AND c.nugly = 'AU9T8K' AND c.payroll_code = 'HRLY-W' 
     AND c.fridate = '2010-01-22' AND c.week_end_date = '2010-01-17' 
ORDER BY c.fridate, c.nugly, payroll_code 

где положение, очевидно, специально для этого случая, в конечном запросе, там не будет, где положение.

+0

Можете ли вы показать нам код, который вы уже пробовали и Ожидаемые результаты? –

+0

Pls не использует вкладки при размещении контента на SO - делает форматирование кошмаром –

+0

Извините, просто скопируйте и вставьте. – spuppett

ответ

0

Это предположение, но вы могли бы использовать что-то вроде ROW_NUMBER сделать своеобразное поле идентификации для каждой таблицы и затем присоединиться к ним?

Что-то вроде

CREATE VIEW vwOrderedTable1 
AS 
SELECT ROW_NUMBER() OVER(ORDER BY week_end_date) AS 'RowNumber', 
    week_end_date, 
    nugly, 
    payroll_code... 
FROM Table1 
GO 

CREATE VIEW vwOrderedTable2 
AS 
SELECT ROW_NUMBER() OVER(ORDER BY week_end_date) AS 'RowNumber', 
    week_end_date, 
    nugly, 
    'payroll_code' = pay_code... 
FROM Table2 
GO 

SELECT * 
FROM vwOrderedTable1 
INNER JOIN vwOrderedTable2 ON vwOrderedTable1.RowNumber = vwOrderedTable2.RowNumber 
+0

Я рассмотрю это. Это выглядит многообещающим; У меня никогда не было случая использовать OVER(). – spuppett

+0

[http://msdn.microsoft.com/en-us/library/ms186734.aspx](http://msdn.microsoft.com/en-us/library/ms186734.aspx) – Alex

+0

Я не могу гарантировать, что обе таблицы будут содержать одинаковое количество строк, и поэтому их можно будет упорядочить одинаково. – spuppett

0

Не могли бы вы предоставить немного больше информации? Как выглядит ваш текущий запрос? Как структурируются таблицы? Вы пытаетесь присоединиться к клавишам?

Вы упомянули, что вы «смотрели» на чек # и trx_number ... это результаты?

У вас есть пример того, что будет возвращено для линий, которые вы предоставили?


Мне нравится ответ Алекса, он кажется твердым.

Возможно, глупый комментарий, но если вам все равно, какой trx_number вы получите, и в вашем примере запроса вы используете левое соединение, из которого следует только «все» данные с checkByNuglyPaycode, почему вы присоединяетесь две таблицы? вам нужны все данные для обеих таблиц? Больше похоже на полное внешнее соединение?

Так что, если есть запись в checkByNuglyPaycode, которая не находится в trxNumByNuglyPaycode, вам это нужно?

И если есть запись в trxNumByNuglyPaycode, а не в checkByNuglyPaycode, вам это нужно?


Интересно, если вам нужны все данные из обеих таблиц, вы можете использовать приведенный ниже выбор. Примечание: она использует отчетливую, который, вероятно, будет медленным, и я думаю, что полные внешние соединения также может быть медленными ... это было давненько ...

SELECT DISTINCT 
    ISNULL(c.week_end_date, t.week_end_date), ISNULL(c.nugly,t.nugly), 
    ISNULL(c.payroll_code,t.payroll_code), ISNULL(c.rate,t.rate), 
    ISNULL(c.hours, t.hours), c.check_number, t.trx_number 
FROM 
    checksByNuglyPaycode c 
FULL OUTER JOIN 
    trxNumByNuglyPaycode t ON c.db_id = t.db_id 
          AND c.fridate = t.fridate 
          AND c.nugly = t.nugly 
          AND c.trx_type = t.trx_type 
          AND c.payroll_code = t.pay_code 
          AND c.hours = t.hours 
          AND c.rate = t.rate 
          AND c.week_end_date = t.week_end_date 
ORDER BY 
    c.fridate, c.nugly, payroll_code 
+0

Это должно быть добавлено в качестве комментария по исходному вопросу, а не по собственному желанию :) –

+0

Я не мог понять, как красиво отформатировать материал здесь, поэтому я добавил его выше. – spuppett

+0

Обычно я забочусь о том, какой trx_number, это просто в этих случаях, если я получаю один из trx_numbers с одним из проверок, я хорош. Есть еще много trx_numbers, тогда в нашей системе есть check_numbers, поэтому я делаю левое соединение; Мне не нужны все trx_numbers, но мне нужны все check_numbers – spuppett

0

А что-то вроде запроса вы уже получили в качестве подзапроса укутывают:

SELECT MAX(trx_number), week_end_date, nugly, payroll_code, rate, hours, check_number 
FROM 
(
    QUERY_YOU_ALREADY_HAVE 
) tbl 
GROUP BY week_end_date, nugly, payroll_code, rate, hours, check_number 
+0

Это очень близко, но в моем тестовом примере два контрольных номера получают одинаковый trx_number, и я хотел бы получить один из них. – spuppett