Iscriviti a 2 record in 1 Tabella con 2 record in un'altra tabella per produrre 2 record

StackOverflow https://stackoverflow.com/questions/5010213

  •  14-11-2019
  •  | 
  •  

Domanda

Ho 2 tavoli con molti dati che ho bisogno di aderire.Il problema è che le 2 tabelle contengono per lo più gli stessi dati, e il join a volte produce indesiderato, anche se non inaspettato.Risultati.Ecco un esempio:

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
.

Sto guardando al controllo # e il trx_number combinato nel join, ma finisco con una croce unisciti perché tutto è lo stesso che mi sto unendo.Per ogni caso, mi piace, non mi interessa davvero che TRX_Number finisca con il quale il controllo del controllo.

Qualche idea?

Ecco i risultati correnti:

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
.

Cosa mi piacerebbe è:

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
.

Dove non mi interessa davvero quale trx_number è con quale check_number.

Ecco la mia query corrente:

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
.

La clausola WHERE è ovviamente specificatamente per questo caso, nella query finale, non ci sarà una clausola dove.

È stato utile?

Soluzione

È un'ipotesi, ma potresti usare qualcosa come row_number per creare una sorta di campo di identità per ogni tabella e poi aderire a loro?

Qualcosa come

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
.

Altri suggerimenti

Che mi dici di qualcosa come la query che hai già ottenuto come sotto-query avvolto con:

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
.

Potresti fornire un po 'più informazioni? Come è la tua query corrente? Come sono strutturati i tavoli? Stai cercando di unirti alle chiavi?

Dicki stai "guardando" al controllo # e trx_number ... sono questi i risultati?

Hai un esempio di cosa verrebbe restituito per le linee che hai fornito?


.

Mi piace la risposta di Alex, sembra solida.

Forse un commento sciocco, ma se non ti interessa quale TRX_Number ottenerti, e nella tua query del campione, stai utilizzando un join sinistro che implica solo tu vuoi solo "tutti" i dati da checksbynuglypaycode, perché ti stai unendo il Due tavoli? Hai bisogno di tutti i dati per entrambe le tabelle? Più come un join completo completo?

Quindi se c'è un record in ChecksbyNuglyPayCode che non è in trxnumbynuglypaycode che ne avresti bisogno?

E se c'è un record in TRXNUMBYNUGLYCODE e non in controlliWSBYNUGLYCode necessita che?


.

Interessante a parte, se si desidera tutti i dati da entrambe le tabelle è possibile utilizzare la selezione di seguito. Nota: usa distinto che probabilmente sarà lento, e penso che i full join esterni possano anche essere lenti ... è passato un bel po '...

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
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top