2011-02-15 2 views
0

J'ai 2 tables avec beaucoup de données que je dois rejoindre. Le problème est que les 2 tables contiennent principalement les mêmes données, et que la jointure produit parfois des indésirables, mais pas inattendus. résultats. Voici un exemple:Joindre 2 enregistrements dans 1 tableau avec 2 enregistrements dans une autre table pour produire 2 enregistrements

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 

Je suis à la recherche du chèque # et la trx_number combinée à la jointure, mais je me retrouve avec une croix rejoindre parce que tout est le même que je me joins à le. Pour chaque cas que j'ai comme ça, je ne m'en soucie vraiment pas avec trx_number qui finit avec quelle vérification #.

Des pensées?

Voici les résultats actuels:

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 

Ce que je voudrais est:

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 

Là où je ne suis pas vraiment ce qui est trx_number qui check_number.

Voici ma requête en cours:

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 clause where est évidemment spécifiquement pour ce cas, dans la requête finale, il n'y aura pas une clause where.

+0

Pouvez-vous nous montrer le code que vous avez essayé et Résultats attendus? –

+0

Pls n'utilise pas d'onglets lors de la publication de contenu sur SO - fait du formatage un cauchemar –

+0

Désolé, il suffit de copier et coller. – spuppett

Répondre

0

Il est une supposition, mais pourriez-vous utiliser quelque chose comme ROW_NUMBER faire une sorte de champ d'identité pour chaque table et ensuite se joindre à eux?

Quelque chose comme

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

Je vais examiner cela. Cela semble prometteur; Je n'ai jamais vraiment eu l'occasion d'utiliser OVER(). – spuppett

+0

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

+0

Je ne peux pas garantir que les deux tables contiendront le même nombre de lignes et pourront donc être ordonnées de la même manière. – spuppett

0

Pourriez-vous fournir un peu plus d'informations? À quoi ressemble votre requête actuelle? Comment sont structurées les tables? Est-ce que vous essayez de vous joindre à des clés? Vous mentionnez que vous "cherchez" à vérifier # et trx_number ... sont-ce les résultats?

Avez-vous un exemple de ce qui serait retourné pour les lignes que vous avez fournies?


J'aime la réponse d'Alex, elle semble solide. Peut-être un commentaire stupide, mais si vous ne vous souciez pas de ce que trx_number vous obtenez, et dans votre exemple de requête que vous utilisez une jointure gauche qui implique que vous voulez seulement "toutes" les données de checksByNuglyPaycode, pourquoi vous rejoignez les deux tables? Avez-vous besoin de toutes les données pour les deux tables? Plus comme une jointure externe complète? Donc s'il y a un enregistrement dans checksByNuglyPaycode qui n'est pas dans trxNumByNuglyPaycode, vous en auriez besoin? Et s'il y a un enregistrement dans trxNumByNuglyPaycode et non dans checksByNuglyPaycode, vous en auriez besoin? De plus, si vous voulez toutes les données des deux tables, vous pouvez utiliser la sélection ci-dessous. Remarque: il utilise distinct qui serait probablement lente, et je pense externe complète joint peut aussi être lent ... ça a été un bon moment ...

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

Cela devrait être ajouté comme un commentaire sous la question originale plutôt que d'une réponse dans son propre droit :) –

+0

Je ne pouvais pas comprendre comment formater les choses bien ici, donc je l'ai ajouté ci-dessus. – spuppett

+0

Habituellement, je me soucie de savoir quel numéro de trx, c'est juste dans ces cas de bord, tant que je reçois l'un des trx_numbers avec l'un des numéros de vérification, je vais bien. Il y a beaucoup plus de trx_numbers alors il y a check_numbers dans notre système, c'est pourquoi je fais une jointure à gauche; Je n'ai pas besoin de tous les trx_numbers, mais j'ai besoin de tous les check_numbers – spuppett

0

Qu'en est-il quelque chose comme la requête que vous avez déjà une sous-requête enveloppé avec:

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

C'est très proche, mais dans mon cas de test, les deux numéros de chèques obtiennent le même nombre trx, et j'aimerais en avoir un de chaque. – spuppett

Questions connexes