Domanda Aggiornare la query utilizzando Subquery in Sql Server


Ho una tabella semplice Struttura come questa:

tavolo TempData

╔══════════╦═══════╗
║   NAME   ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║    80 ║
║ Ravi     ║    85 ║
║ Sanjay   ║    90 ║
╚══════════╩═══════╝

E ho anche un altro nome di tavolo come tempDataView come questo

╔══════════╦═══════╗
║   NAME   ║ MARKS ║
╠══════════╬═══════╣
║ Narendra ║       ║
║ Narendra ║       ║
║ Narendra ║       ║
║ Narendra ║       ║
║ Ravi     ║       ║
║ Ravi     ║       ║
║ Sanjay   ║       ║
╚══════════╩═══════╝

Voglio aggiornare la tabella tempDataView , impostando il votazione  secondo il tempDataView - Nome paragonato a TempData - Nome

Sì, lascia che ti mostri quello che ho provato, ho provato a risolverlo usando il Cursore e il problema è risolto perfettamente, ma sto trovando il modo di risolverlo usando il subquery

Ecco qui:

Declare @name varchar(50),@marks varchar(50)
Declare @cursorInsert CURSOR
set @cursorInsert = CURSOR FOR
Select name,marks from tempData
OPEN @cursorInsert
FETCH NEXT FROM @cursorInsert
into @name,@marks
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE tempDataView set marks = @marks where name = @name
FETCH NEXT FROM @cursorInsert
INTO @name,@marks
END
CLOSE @cursorInsert
DEALLOCATE @cursorInsert

In realtà è come fare i compiti per me per risolverlo usando la Subquery.


46
2018-01-31 04:50


origine


risposte:


puoi unirti a entrambi i tavoli anche su UPDATE dichiarazioni,

UPDATE  a
SET     a.marks = b.marks
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name

per prestazioni più veloci, definire un INDEX sulla colonna marks su entrambi i tavoli.

utilizzando SUBQUERY

UPDATE  tempDataView 
SET     marks = 
        (
          SELECT marks 
          FROM tempData b 
          WHERE tempDataView.Name = b.Name
        )

107
2018-01-31 04:52



perché stai solo imparando ti suggerisco di esercitarti a convertire un join SELECT in UPDATE o DELETE join. Per prima cosa ti suggerisco di generare un'istruzione SELECT che unisce queste due tabelle:

SELECT *
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name

Quindi nota che abbiamo due alias di tabella a e b. Usando questi alias puoi facilmente generare un'istruzione UPDATE per aggiornare la tabella a o b. Per il tavolo a hai una risposta fornita da JW. Se si desidera aggiornare b, la dichiarazione sarà:

UPDATE  b
SET     b.marks = a.marks
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name

Ora, per convertire l'istruzione in un'istruzione DELETE utilizzare lo stesso approccio. La seguente affermazione cancellerà da a solo (lasciando b intatto) per quei record che corrispondono per nome:

DELETE a
FROM    tempDataView a
        INNER JOIN tempData b
            ON a.Name = b.Name

Puoi usare SQL Fiddle creato da JW come un parco giochi


22
2018-01-31 05:00



Qui è una bella spiegazione dell'operazione di aggiornamento con alcuni esempi. Sebbene sia Postgres, le query SQL sono valide anche per gli altri DB. I seguenti esempi sono intuitivi da capire.

-- Update contact names in an accounts table to match the currently assigned salesmen:

UPDATE accounts SET (contact_first_name, contact_last_name) =
    (SELECT first_name, last_name FROM salesmen
     WHERE salesmen.id = accounts.sales_id);

-- A similar result could be accomplished with a join:

UPDATE accounts SET contact_first_name = first_name,
                    contact_last_name = last_name
  FROM salesmen WHERE salesmen.id = accounts.sales_id;

Tuttavia, la seconda query può dare risultati imprevisti se salesmen.id non è una chiave univoca, mentre la prima query è garantita per generare un errore se ci sono più corrispondenze di identificazione. Inoltre, se non esiste una corrispondenza per una particolare voce accounts.sales_id, la prima query imposterà i corrispondenti campi nome su NULL, mentre la seconda query non aggiornerà affatto quella riga.

Quindi, per l'esempio dato, la query più affidabile è simile alla seguente.

UPDATE tempDataView SET (marks) =
    (SELECT marks FROM tempData
     WHERE tempDataView.Name = tempData.Name);

0
2017-08-03 16:04



Il titolo di questa discussione chiede come può essere utilizzata una sottoquery in un aggiornamento. Ecco un esempio di questo:

update [dbName].[dbo].[MyTable] 
set MyColumn = 1 
where 
    (
        select count(*) 
        from [dbName].[dbo].[MyTable] mt2 
        where
            mt2.ID > [dbName].[dbo].[MyTable].ID
            and mt2.Category = [dbName].[dbo].[MyTable].Category
    ) > 0

-1
2017-09-21 10:21