2014-09-19 7 views
5

Próbuję napisać zapytanie, które aktualizuje pole HID tbl8_update_transactions (gdzie jest puste) z kluczową wartością klucza (HID), która jest najwyższa w HOLIDAY_DATE_TABLE . I pojawia się następujący błądZapytanie o aktualizację SQL - agregacja może nie pojawić się na liście zestawów instrukcji UPDATE

„An łączna nie może pojawić się w wykazie określonym w instrukcji UPDATE”

Czytałem, że muszę to osiągnąć za pomocą podzapytania, ale potrzebują pomocy. Dzięki

USE BillingUI; 
UPDATE tbl8_update_transactions 
SET tbl8_update_transactions.HID = MAX(HOLIDAY_DATE_TABLE.HID) 
FROM HOLIDAY_DATE_TABLE 
WHERE tbl8_update_transactions.HID = NULL; 

Aktualizacja: Tried Proponowane rozwiązanie

UPDATE tbl8_update_transactions 
SET HID = h.maxHID 
FROM (select max(HOLIDAY_DATE_TABLE.HID) as maxHID from HOLIDAY_DATE_TABLE) h 
WHERE tbl8_update_transactions.HID IS NULL; 

Niestety wpływa to na wiersze 0/nie działa. Myślę, że to dlatego, że HID jest kluczem obcym (w tbl8_update_transactions). Prawdziwym problemem wydaje się być moja metodologia C# do wstawiania rekordów do tabeli (wstawia wiersz bez zapełniania klucza obcego). Chciałbym obsłużyć go z wyzwalaczy, a nie kod C#. Moje tabele są następujące.

USE BillingUI; 
CREATE TABLE HOLIDAY_DATE_TABLE 
(
HID INT IDENTITY PRIMARY KEY, 
TABLE_NUMBER nchar(2) NOT NULL, 
HOLIDAY_DATE nchar(8) NOT NULL, 
FIELD_DESCRIPTION nVARchar(43) NULL, 
); 

USE BillingUI; 
CREATE TABLE tbl8_update_transactions 
(
TID INT IDENTITY PRIMARY KEY, 
TABLE_NUMBER nchar(2) NOT NULL, 
HOLIDAY_DATE nchar(8) NOT NULL, 
FIELD_DESCRIPTION nVARchar(43) NULL, 
HID int, 
FOREIGN KEY (HID) REFERENCES HOLIDAY_DATE_TABLE (HID) 
); 

myślę, że może to rozwiązać zerowej kluczową kwestię zagraniczną, czy mogę uzyskać pomoc z nią

CREATE TRIGGER tbl8_ins 
ON HOLIDAY_DATE_TABLE 
FOR INSERT 
AS 
BEGIN 
INSERT INTO tbl8_update_transactions 
SELECT * FROM HOLIDAY_DATE_TABLE 
WHERE HID = MAX(HID); 
END 

w przypadku chcesz zobaczyć mojego kodu C#, który wykonuje wkładkę z powodzeniem, ale nie wypełnić klucz obcy

public ActionResult Create() 
    { 
     return View(); 
    } 

    // 
    // POST: /Table8/Create 

    [HttpPost] 
    public ActionResult Create(HOLIDAY_DATE_TABLE holiday_date_table, tbl8_update_transactions tbl8_update_transaction) 
    { 
     if (ModelState.IsValid) 
     { 
      db.HOLIDAY_DATE_TABLE.Add(holiday_date_table); 
      db.SaveChanges(); 
      db.tbl8_update_transactions.Add(tbl8_update_transaction); 
      db.SaveChanges(); 
      return RedirectToAction("../Billing/HolidayDateTable"); 
     } 
     return View(holiday_date_table); 
    } 
+0

Twoja składnia sprzężenia nie jest całkiem poprawna i myślę, że będziesz musiał użyć CTE lub wstępnie obliczonej zmiennej, aby obliczyć dowolne agregaty osobno. Obecnie, jeśli te dwie tabele nie są skorelowane w żaden sposób, powinieneś używać zmiennej. Również '= NULL' nie ma sensu; Myślę, że miałeś na myśli 'IS NULL'. –

+0

'DECLARE @ h INT; SELECT @h = MAX (HID) Z dbo.HOLIDAY_DATE_TABLE; UPDATE dbo.tbl8_update_transactions SET HID = @h GDZIE HID JEST NIŻE; ' –

Odpowiedz

9

Możesz napisać kwerendę tak:

UPDATE tbl8_update_transactions 
    SET HID = h.maxHID 
    FROM (select max(HOLIDAY_DATE_TABLE.HID) as maxHID from HOLIDAY_DATE_TABLE) h 
    WHERE tbl8_update_transactions.HID IS NULL; 

Używanie klauzuli from jest dla mnie mylące i nie ma tam wspomnianego głównego stołu. Wolę napisać to jako:

UPDATE ut 
    SET HID = h.maxHID 
    FROM tbl8_update_transactions ut CROSS JOIN 
     (select max(HID) as maxHID from HOLIDAY_DATE_TABLE) h 
    WHERE ut.HID IS NULL; 
+0

' = NULL' nie ma sensu w SQL Server. Mimo to, ponieważ każdy wiersz 'NULL' ma tę samą wartość, dlaczego komplikować instrukcję aktualizacji zamiast po prostu wypychać max do zmiennej? –

+0

@AaronBertrand. . . Dziękuję Ci. Skopiowałem to bez myślenia (oczywiście) / –

-5

Brakuje SELECT.

Napisałeś

MAX(HOLIDAY_DATE_TABLE.HID) FROM HOLIDAY_DATE_TABLE 

Prawdopodobnie oznaczało

SELECT MAX(HOLIDAY_DATE_TABLE.HID) FROM HOLIDAY_DATE_TABLE 
0

Chyba, proponowanego kod jest prawidłowy, po prostu brakowało SELECT

UPDATE tbl8_update_transactions 
SET HID = (SELECT h.maxHID 
FROM (select max(HOLIDAY_DATE_TABLE.HID) as maxHID from HOLIDAY_DATE_TABLE) h 
WHERE tbl8_update_transactions.HID IS NULL); 
0

Okazuje się, że można używać agregatów w instrukcji UPDATE przy użyciu tego formatu zamiast:

;WITH [ProjectHoursTotal] AS ( 
    SELECT 
     ProjectId = [ProjectHours].[ProjectId] 
     , FirstActivity = MIN([ProjectHours].[EntryDate]) 
     , LastActivity = MAX([ProjectHours].[EntryDate]) 
     , TotalHours = SUM([ProjectHours].[TotalHours]) 
    FROM 
     [dbo].[ProjectHours] 
    GROUP BY 
     [ProjectHours].[ProjectId] 
) 
UPDATE 
    [dbo].[Project] 
SET 
    [Project].[FirstActivity] = [ProjectHoursTotal].[FirstActivity] 
    , [Project].[LastActivity] = [ProjectHoursTotal].[LastActivity] 
    , [Project].[TotalHours] = [ProjectHoursTotal].[TotalHours] 
FROM 
    [dbo].[Project] 
    INNER JOIN [ProjectHoursTotal] ON [Project].[ProjectId] = [ProjectHoursTotal].[ProjectId] 

Średnik nie jest literówką.

Super szybki i bardzo łatwy!

Powiązane problemy