SóProvas


ID
1403977
Banca
FGV
Órgão
TJ-BA
Ano
2015
Provas
Disciplina
Banco de Dados
Assuntos

Considere uma tabela relacional TX, cuja instância é mostrada a seguir.

                               A       B
                               4        4
                               2        3
                               3        4
                               3        2

Considere também o comando SQL abaixo.

                       delete from TX
                       where exists
                               (select * from TX tt where TX.B=tt.A)

O número de registros deletados da tabela TX por esse comando é:

Alternativas
Comentários
  • Como o sub-select faz referencia a tabela do select externo, o comando irá procurar um numero igual independente deste estar diretamente relacionado com a coluna A. Como os mesmos números existem tanto na coluna A quanto na B, o comando apaga todas as tuplas por esse motivo.

  • O resultado do produto cartesiano da subconsulta é o total da tabela, pois todos os valores em B têm correspondentes em A, independente de estarem diretamente relacionados em TX. A sobconsulta cria uma segunda tabela lógica tt.

  • Resultado:

    | A | B | 

    |---|---| 

    | 4 | 4 | 

    | 2 | 3 |

    | 3 | 4 |

    | 3 | 2 |

    http://sqlfiddle.com/#!9/d46e5/1
  • Questão pegadinha. Pelo menos com a pressa dá a entender que serão apagados apenas a quantidade de registros que existirem na inner query, porém é mais fácil do que isso basta que o comando exists retorne TRUE para que o DELETE do mal seja executado em todos os registros da tabela TX.

  • Como exemplo, se mudarmos a instância para

    a | b

    ------

    4 | 4

    2 | 3

    3 | 4

    3 | 1

    ------

    a última tupla não seria apagada, já que, ao comparar o valor 1 com os valores da coluna A o select retornaria F (não existe valor 1 na coluna a), não executando o delete sobre a referida tupla.

    O resultado seria: 3 registros apagados.

  • Considere uma tabela relacional TX, cuja instância é mostrada a seguir. 

                                   A       B
                                   4        4
                                   2        3
                                   3        4
                                   3        2

    Considere também o comando SQL abaixo. 

    delete from TX 
                           where exists 
                                   (select * from TX tt where TX.B=tt.A)

    A cláusula "exists" na DML apresentada permite que você exclua registros em uma tabela com base nos valores de outra tabela.

    Esse comando deleta registros da tabela TX que tenham valores iguais nas colunas A e B. 

    Mas como isso é possível usar "exists" se somente existe uma tabela, a tabela TX?
    Nesse caso, para que fosse possível utilizar o cláusula "exists" a tabela TX foi renomeada para tt na sub-query e a cláusula WHERE compara todos os itens da tabela TX coluna B com os itens a "tabela" tt coluna A, para que sejam todos deletados da tabela TX.

    A       B
    4   =   4

    RESPOSTA letra: e)