0

結合する必要のある大量のデータを含む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

where句は明らかにこの場合に特化したものであり、最後のクエリではwhere句はありません。

4

3 に答える 3

0

もう少し情報を教えていただけますか?現在のクエリはどのようになっていますか?テーブルはどのように構成されていますか?キーに参加しようとしていますか?

チェック番号とtrx_numberを「探している」とおっしゃっていますが、これらは結果ですか?

提供した回線に対して何が返されるかの例はありますか?


私はアレックスの答えが好きです、それはしっかりしているようです。

おそらくばかげたコメントですが、取得するtrx_numberを気にせず、サンプルクエリで、checksByNuglyPaycodeからの「すべての」データのみが必要であることを意味する左結合を使用している場合、なぜ2つのテーブルを結合するのですか?両方のテーブルのすべてのデータが必要ですか?完全な外部結合のようなものですか?

したがって、trxNumByNuglyPaycodeにないchecksByNuglyPaycodeにレコードがある場合、それが必要になりますか?

そして、trxNumByNuglyPaycodeにレコードがあり、checksByNuglyPaycodeにはない場合、それが必要になりますか?


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

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
于 2011-02-15T22:33:41.273 に答える
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
于 2011-02-15T22:41:41.847 に答える
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
于 2011-02-15T23:27:53.897 に答える