2011-02-15 19 views
0

2つのテーブルがあり、参加する必要があるデータがたくさんあります。問題は、2つのテーブルがほとんど同じデータを保持していることです。結果。次に例を示します。2つのレコードを別のテーブルに入れて2つのレコードを作成する1つのテーブルに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 

私は本当にどのCHECK_NUMBERであるtrx_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句がありません。

は、ここに私の現在のクエリです。

+0

あなたは私たちにあなたが試したコードを表示することができますし、予想された結果? –

+0

SOはコンテンツを投稿するときにタブを使用しません - フォーマットを悪夢にします –

+0

申し訳ありません。コピーして貼り付けてください。 – spuppett

答えて

0

それは推測だが、あなたはROW_NUMBERのようなものを使用することができます各テーブルの一種のIDフィールドを作成し、それらに結合しますか?すでにと包まれたサブクエリとして持っているクエリのようなものについては何

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を取得しても構わない場合は、サンプル結合で左結合を使用しています。つまり、チェックByNuglyPaycodeのデータをすべて "すべて" 2つのテーブル?両方のテーブルのすべてのデータが必要ですか?もっと完全な外部結合に似ていますか?

したがって、checkByNuglyPaycodeにはtrxNumByNuglyPaycodeにないレコードが必要ですか?

trxNumByNuglyPaycodeにレコードがあり、チェックByNuglyPaycodeにレコードがない場合は、それが必要ですか?


興味深いことに、両方のテーブルのすべてのデータが必要な場合は、以下の選択を使用できます。注意:それはおそらく遅くなると思われる明確な使用しています、と私は完全外部も遅くなることが合流...それはかなりしばらくしていると思います...

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を気にしますか、それはちょうど私がcheck_numbersの1つでtrx_numbersの1つを得る限り、これらの端の場合です。さらに多くの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

これは非常に近いですが、私のテストケースでは、2つの小切手番号が同じtrx_numberを取得しています。それぞれを1つ取得したいと思います。 – spuppett

関連する問題