1

そこで、同僚のために書いた次のクエリ (以下を参照) があります。

SELECT
        t.tender_id as "Tender ID",
        t.check_number as "Check Number",
        t.check_type_id as "Check Type",
        t.server_id as "Server ID",
        t.cashier_id as "Cashier ID",
        t.terminal_id as "Terminal ID",
        t.tendered_date_time as "Tendered Date and Time",
        t.tender_amount as "Tender Amount",
        t.change_amount as "Change Amount",
        g.account_name as "Account Name",
        g.account_number as "Account Number"
FROM CheckTender AS t
INNER JOIN AcountActivity AS g
        ON t.check_number = g.check_number
WHERE t.tender_id NOT in (5,14,4,9,15,16);

小切手番号は複数の入札 ID を持つことができます。したがって、たとえば、小切手番号 20001 に対して 3 つの行があり、すべてが異なるender_ID を持つ場合があります。

最初は、tender_id が5,14,4,9,15,16削除されたすべてのエントリが必要でした。しかしその後、where 基準を変更する必要があることがわかりました。

5,14,4,9,15,16小切手番号の支払い ID が の場合、その小切手番号のすべてのインスタンスが削除されるように更新する必要があります。これがサブクエリである可能性が最も高いことはわかっていますが、理解できずに午前中ずっと頭を悩ませてきました。:(

4

3 に答える 3

3

これに使用できますEXISTS

SELECT
        t.tender_id as "Tender ID",
        t.check_number as "Check Number",
        t.check_type_id as "Check Type",
        t.server_id as "Server ID",
        t.cashier_id as "Cashier ID",
        t.terminal_id as "Terminal ID",
        t.tendered_date_time as "Tendered Date and Time",
        t.tender_amount as "Tender Amount",
        t.change_amount as "Change Amount",
        g.account_name as "Account Name",
        g.account_number as "Account Number"
FROM CheckTender AS t
INNER JOIN AcountActivity AS g
        ON t.check_number = g.check_number
WHERE NOT EXISTS (  SELECT * FROM CheckTender WHERE check_number =  t.check_number
                    AND tender_id in (5,14,4,9,15,16))
于 2013-01-18T16:01:31.223 に答える
2

このようなもの(未テスト)?

SELECT
        t.tender_id as "Tender ID",
        t.check_number as "Check Number",
        t.check_type_id as "Check Type",
        t.server_id as "Server ID",
        t.cashier_id as "Cashier ID",
        t.terminal_id as "Terminal ID",
        t.tendered_date_time as "Tendered Date and Time",
        t.tender_amount as "Tender Amount",
        t.change_amount as "Change Amount",
        g.account_name as "Account Name",
        g.account_number as "Account Number"
FROM CheckTender AS t
INNER JOIN AcountActivity AS g
        ON t.check_number = g.check_number
LEFT JOIN (SELECT check_number  FROM CheckTender WHERE tender_id in (5,14,4,9,15,16)) t2 on t.tender_id = t2.tender_id
WHERE t2.tender_id is null
于 2013-01-18T16:01:50.913 に答える
2

ウィンドウ関数でそれを行う方法は次のとおりです。

select *
from (SELECT
             t.tender_id as "Tender ID",
             t.check_number as "Check Number",
             t.check_type_id as "Check Type",
             t.server_id as "Server ID",
             t.cashier_id as "Cashier ID",
             t.terminal_id as "Terminal ID",
             t.tendered_date_time as "Tendered Date and Time",
             t.tender_amount as "Tender Amount",
             t.change_amount as "Change Amount",
             g.account_name as "Account Name",
             g.account_number as "Account Number",
             MAX(case when t.tender_id in (5,14,4,9,15,16) then 1 else 0 end) over (partition by t.check_number) as HasBadTender
      FROM CheckTender AS t
      INNER JOIN AcountActivity AS g
                 ON t.check_number = g.check_number
     ) t
where HasBadTender = 0

これは、SQL Server 2005 以降で機能します。以前のバージョンでは、なんらかの形式の結合または相関サブクエリが必要になります。

元の where 句のわずかなバリエーションも機能します。

WHERE t.check_number not in (select check_number from CheckTender where tender in (5,14,4,9,15,16))
于 2013-01-18T16:03:42.753 に答える