T-SQL Помогите составить запрос

Smekalisty
Дата: 21.01.2013 20:38:08
Добрый вечер

DECLARE @t TABLE
(
Id INT
)

// манипулции, @t запоняется цифрами (записей > 1)
// теперь нужно вставить данные в табличку, только если колонка уже его не содержит (значение из @t.[Id])

INSERT INTO [Favorites]
(
[PersonId]
,[FirstName]
,[LastName]
)
VALUES
(
значение из @t
,'Костя'
,'Цзю'
)

Костя не должен попасть в [Favorites], если там уже есть PersonId из @t

Спасибо :-)
ZVER-10
Дата: 21.01.2013 21:20:09
Smekalisty,
повесить триггер к табл Favorites не вариант?
Smekalisty
Дата: 21.01.2013 22:07:54
Неа
Там можно как-то IF NOT EXISTS но у меня для массива записей не получается (
alexeyvg
Дата: 21.01.2013 22:47:06
Smekalisty
Там можно как-то IF NOT EXISTS но у меня для массива записей не получается (
Для массива нужно не писать "IF", а добавить NOT EXISTS в условие запроса.

Открываете хелп, вводите слово EXISTS, читаете пример Г)
хелп, пример Г
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person AS p 
JOIN HumanResources.Employee AS e
   ON e.BusinessEntityID = p.BusinessEntityID 
WHERE NOT EXISTS
(SELECT *
   FROM HumanResources.Department AS d
   JOIN HumanResources.EmployeeDepartmentHistory AS edh
      ON d.DepartmentID = edh.DepartmentID
   WHERE e.BusinessEntityID = edh.BusinessEntityID
   AND d.Name LIKE 'P%')
ORDER BY LastName, FirstName
Smekalisty
Дата: 21.01.2013 23:19:57
А Insert?
Непонятно, как Insert прикручивать к этому коду?
alexeyvg
Дата: 21.01.2013 23:26:54
Smekalisty
А Insert?
Непонятно, как Insert прикручивать к этому коду?
INSERT пишется перед SELECT.

Да, я для вас наверняка будет открытием, что если набрать в хелпе слово INSERT, можно увидеть массу примеров, допустим:
INSERT INTO dbo.EmployeeSales
    SELECT 'SELECT', e.BusinessEntityID, c.LastName, sp.SalesYTD 
    FROM HumanResources.Employee AS e
        INNER JOIN Sales.SalesPerson AS sp
        ON e.BusinessEntityID = sp.BusinessEntityID 
        INNER JOIN Person.Person AS c
        ON e.BusinessEntityID = c.BusinessEntityID
    WHERE e.BusinessEntityID LIKE '2%'
    ORDER BY e.BusinessEntityID, c.LastName;


Только обращаю внимание, что хорошей практикой является перечисление полей в INSERT, т.е. лучше писать так:
INSERT INTO MyTable (LocationID, CostRate, ModifiedDate)
    SELECT LocationID, CostRate, GETDATE() FROM Production.Location
    WHERE CostRate > 0;
Cygapb-007
Дата: 22.01.2013 00:02:43
Вроде надо было insert values прикрутить. тогда
if not exists(select null from @table t where t.Id = @id)
  insert into Favorites values (@id,...)
Cygapb-007
Дата: 22.01.2013 00:07:10
ну, или "from Favorites t"
ITHunter
Дата: 22.01.2013 12:48:18
Smekalisty
Добрый вечер

DECLARE @t TABLE
(
Id INT
)

// манипулции, @t запоняется цифрами (записей > 1)
// теперь нужно вставить данные в табличку, только если колонка уже его не содержит (значение из @t.[Id])

INSERT INTO [Favorites]
(
[PersonId]
,[FirstName]
,[LastName]
)
VALUES
(
значение из @t
,'Костя'
,'Цзю'
)

Костя не должен попасть в [Favorites], если там уже есть PersonId из @t

Спасибо :-)



INSERT INTO [Favorites]
(
[PersonId]
,[FirstName]
,[LastName]
)
select id
,'Костя'
,'Цзю'
from @t
ITHunter
Дата: 22.01.2013 12:50:19
ITHunter
Smekalisty
Добрый вечер

DECLARE @t TABLE
(
Id INT
)

// манипулции, @t запоняется цифрами (записей > 1)
// теперь нужно вставить данные в табличку, только если колонка уже его не содержит (значение из @t.[Id])

INSERT INTO [Favorites]
(
[PersonId]
,[FirstName]
,[LastName]
)
VALUES
(
значение из @t
,'Костя'
,'Цзю'
)

Костя не должен попасть в [Favorites], если там уже есть PersonId из @t

Спасибо :-)



INSERT INTO [Favorites]
(
[PersonId]
,[FirstName]
,[LastName]
)
select id
,'Костя'
,'Цзю'
from @t

пардон, не дочитал. Вот так:
INSERT INTO [Favorites]
(
[PersonId]
,[FirstName]
,[LastName]
)
select id
,'Костя'
,'Цзю'
from @t
where id not in (select [PersonId] from [Favorites] )