2011-08-23 18 views
5

Aquí está la Selección Necesito convertir a una actualización:Usando diferenciados en SQL actualización

SELECT DISTINCT f.SectionID, f.Name, v.Enabled 
FROM SETTING_VALUE v 
INNER JOIN SETTING s ON v.SettingID = s.SettingID 
INNER JOIN LU_FIELD f ON f.FieldID = s.FieldID 
WHERE v.DisplayValue LIKE '%Miami%' 
AND f.ControlName LIKE '%City%' 

Mi intento:

UPDATE SETTING_VALUE 
SET Enabled = 0 
FROM SETTING_VALUE v 
INNER JOIN SETTING s ON v.SettingID = s.SettingID 
INNER JOIN LU_FIELD f ON f.FieldID = s.FieldID 
WHERE v.DisplayValue LIKE '%Miami%' 
AND f.ControlName LIKE '%City%' 

No estoy seguro de cómo aplicar Distinto

+0

¿Este es SQL Server? – Yuck

+1

¿Qué quiere decir con 'update distinct'? ¿Puede mostrarnos los datos antes y después de la actualización? –

+3

Buen trabajo usando 'SELECT' para ver los datos antes de actualizarlos. Sin embargo, no sé por qué querrías usar una proyección 'DISTINCT'. ¿No deberían actualizarse todas las filas coincidentes? No veo cómo 'DISTINCT' tendría sentido lógicamente. – Yuck

Respuesta

8

Basado en su comentario, all of the matching rows should be updated no necesita distinta. Simplemente ejecute esto:

UPDATE SETTING_VALUE 
SET Enabled = 0 
FROM SETTING_VALUE v 
INNER JOIN SETTING s ON v.SettingID = s.SettingID 
INNER JOIN LU_FIELD f ON f.FieldID = s.FieldID 
WHERE v.DisplayValue LIKE '%Miami%' 
AND f.ControlName LIKE '%City%' 

Se actualizará todo lo que haya visto en su selección.

+0

¿Pero actualizará las filas más de una vez? – xr280xr

0

Puede probar el siguiente

UPDATE v 
SET Enabled = 0 
FROM SETTING_VALUE v 
WHERE EXISTS(
    select * from SETTING s 
    INNER JOIN LU_FIELD f ON f.FieldID = s.FieldID 
    WHERE v.DisplayValue LIKE '%Miami%' 
    AND f.ControlName LIKE '%City%' 
    AND v.SettingID = s.SettingID 
) 
2

O Ption 1: Use una tabla temporal para mantener los resultados de la consulta inicial, luego actualice según los resultados de la consulta.

Opción 2:

Insert into SETTING_VALUE 
(SectionID, Name, Enabled) 
SELECT DISTINCT f.SectionID, f.Name, v.Enabled 
FROM SETTING_VALUE v 
INNER JOIN SETTING s ON v.SettingID = s.SettingID 
INNER JOIN LU_FIELD f ON f.FieldID = s.FieldID 
WHERE v.DisplayValue LIKE '%Miami%' 
AND f.ControlName LIKE '%City%' 
1
UPDATE SETTING_VALUE 
    SET Enabled = 0 
WHERE DisplayValue LIKE '%Miami%' 
     AND EXISTS (
        SELECT * 
        FROM SETTING s 
        WHERE SETTING_VALUE.SettingID = s.SettingID 
          AND EXISTS (
             SELECT * 
             FROM LU_FIELD f 
             WHERE f.FieldID = s.FieldID 
              AND f.ControlName LIKE '%City%' 
            ) 
       ); 
Cuestiones relacionadas