예고편을 효과적으로 결합하는 색인 된보기를 만들어야합니다. 이를 위해
, 당신은 작은 지원 테이블을 생성 할 것입니다 :
CREATE TABLE place (id INT NOT NULL PRIMARY KEY)
INSERT
INTO place
VALUES (1),
(2)
GO
CREATE VIEW
v_truck_trailers
WITH SCHEMABINDING
AS
SELECT t.id AS truckId,
p.id AS placeId,
CASE p.id WHEN 1 THEN trailer1 WHEN 2 THEN trailer2 END AS trailerId
FROM dbo.truck t
JOIN dbo.place p
ON CASE p.id WHEN 1 THEN trailer1 WHEN 2 THEN trailer2 END IS NOT NULL
GO
CREATE UNIQUE CLUSTERED INDEX
ux_v_truck_trailers_truck_place
ON v_truck_trailers (truckId, placeId)
GO
CREATE UNIQUE INDEX
ux_v_truck_trailers_trailer
ON v_truck_trailers (trailerId)
GO
는 이제 그것을 시도하자 :
INSERT
INTO truck
VALUES (1, 1, NULL) -- succeeds
INSERT
INTO truck
VALUES (2, 2, 3) -- also succeeds
INSERT
INTO truck
VALUES (3, NULL, 2) -- fails as trailer 2 is already used on truck 2, even if on another place.
이 SQLFiddle를 참조하십시오.
동의합니다. 업데이트 또는 삽입을 시도하기 전에 먼저 Select 문을 실행하여 예고편이 있는지 확인하기 위해 SP를 작성하는 것이 더 쉽습니다. 하지만 인덱스를 사용하여 우아한 솔루션을 찾고있었습니다. – navigator
글쎄, 디버깅하기가 매우 어려울 수 있기 때문에 나는 트리거를 좋아하지 않는다. union에 대한 뷰를 생성 한 다음 결과 컬럼을 고유하게 만들 수 있어야합니다. (후드 아래에서 트리거가 발생할 것으로 의심됩니다.) http://msdn.microsoft.com/en-us/library/aa933148%28v=sql.80%29.aspx이게 작동 할 것이라고 제안합니다 –
@IanP : UNION에 인덱스 된 뷰를 생성 할 수 없습니다. – Quassnoi