Czy ktoś może wytłumaczyć, jak nawet wykonuje to zapytanie? Kolumna credit_transaction_key nie istnieje w financial_transaction, ale istnieje w financial_transaction_jnl. Nie rozumiem, dlaczego ten zapytanie jest nawet wykonuje, jeśli kolumna znajduje się w jednej tabeli, ale nie innej tabeli. Czy nie powinien tego tylko błędu?

delete from financial_transaction_jnl
where credit_transaction_key in 
      (select credit_transaction_key
       from financial_transaction
       where account_key in 
             (select account_key
              from account
              where created_by = (select USER_KEY
                                  from USERS 
                                  where USER_ID = 'ME')
                and created_dttm > Cast('2/16/2017' as datetime)
             )
      )

Financial_transaction: Financial_transaction_key Account_key

Financial_transaction_jnl: Financial_transaction_jnl_key Financial_transaction_key Credit_Transaction_key

0
LetUsSeng 17 luty 2017, 01:20

2 odpowiedzi

Najlepsza odpowiedź

Kolumna credit_transaction_key nie istnieje w financial_transaction, ale istnieje w financial_transaction_jnl. [...] Nie powinno to tylko wystąpić?

Nr obecny wiersz. Ponieważ wybrana wartość jest zatem ta sama wartość, która jest porównywana z wyborem, prezentując się zapytanie, ma taki sam efekt, jak to nieco prostsze:

delete from financial_transaction_jnl
where exists (
  SELECT 1
  from financial_transaction
  where account_key in (
    select account_key
    from account
    where created_by = (SELECT USER_KEY  FROM USERS WHERE USER_ID = 'ME')
      AND created_dttm > Cast('2/16/2017' AS DATETIME)
  )
)

Ponieważ klauzula WHERE pojawia się zatem zapytanie zewnętrzne, nie zależeć od wartości w tabeli docelowej, albo wszystkie wiersze lub nie zostaną usunięte. Wydaje się, że wydaje się mało prawdopodobny efekt.

Kwalifikująca się nazwa kolumny w zapytaniu zewnętrznym, jak sugeruje kolejna odpowiedź, nie zmieni tego znaczenia. Kwalifikująca się nazwa kolumny w zapytaniu jako financial_transaction.credit_transaction_key rzeczywiście spowodowałoby zapytanie błędne.

1
John Bollinger 16 luty 2017, 22:59

Musisz użyć aliasów stołowych.

SQL musi założyć, gdzie pochodzą kolumny.

W takim przypadku wszystko zostaje usunięte:

financial_transaction.redit_transaction_key in
(SELECT credit_transaction_key from  financial_transaction

Ale prawdopodobnie próbujesz to zrobić:

financial_transaction_jnl.redit_transaction_key in
    (SELECT credit_transaction_key from  financial_transaction
1
EoinS 16 luty 2017, 22:26