Соедините 2 записи в 1 таблице с 2 записями в другой таблице, чтобы получить 2 записи - PullRequest
0 голосов
/ 16 февраля 2011

У меня есть 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

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

Ответы [ 3 ]

0 голосов
/ 16 февраля 2011

Это предположение, но не могли бы вы использовать что-то вроде 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 голосов
/ 16 февраля 2011

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

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 голосов
/ 16 февраля 2011

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

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

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


Мне нравится ответ Алекса, он выглядит убедительным.

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

Так что, если в checkByNuglyPaycode есть запись, которой нет в trxNumByNuglyPaycode, она вам понадобится?

А если есть запись в trxNumByNuglyPaycode, а не в checkByNuglyPaycode, вам это понадобится?


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

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
...