Peíodos cruzados

Olá, fiz um MDB em Access, mudei pra ANSI-92 e comecei a criá-lo. Nas validações encontrei um problema, no meu banco estou colocando uma tabela com metas para os indicadores. Cada indicador tem a sua meta e ela vale por um período. Como faço um CHECK que verifique se a data inserida no início e no final do período não esteja contido por outro período?

tentei algo ± assim:

ALTER TABLE meta ADD CONSTRAINT chk_periodoSobreposto CHECK( 'OPA!' NOT IN( SELECT 'OPA!' AS result FROM meta WHERE meta.codigoIndicador = codigoIndicador AND ( inicio BETWEEN meta.inicio AND meta.fim OR fim BETWEEN meta.inicio AND meta.fim ) ) )

Nesse código da erro, pois ele compara “ele com ele mesmo”, mas se eu fizer com os valores de entrada fixos ele funciona. Queria que meta.codigoIndicador fossem os dados já gravados e codigoIndicador fosse o que está sendo inserido

Alguma ideia de como resolver isso sem ser validar na aplicação ou usar trigger? M$Access só tem trigger se mudar o projeto pra ADP e rodar no SQL Server :confused:

Para fazer o que você deseja, vai ser preciso usar um "sub-select"
Algo assim:

ALTER TABLE meta ADD CONSTRAINT chk_periodoSobreposto CHECK( 'OPA!' NOT IN( SELECT 'OPA!' AS result FROM meta WHERE meta.codigoIndicador = (SELECT sub.codigoIndicador FROM meta sub WHERE sub.inicio BETWEEN meta.inicio AND meta.fim OR sub.fim BETWEEN meta.inicio AND meta.fim limt 1 ) ) )

SUB-SELECT não é permitida na cláusula CHECK, nem STORED PROCEDURE :?

Desculpe-me, tinha a impressão que já havia feito isso.
Tentou um JOIN com a mesma tabela? É pouco elegante, mas talvez resolva.