I'm trying to constrain values of one table based on values from another. For T1, column 'col' is allowed to be 'A' or 'B'. For T2 column 'col' is allowed to be 'C' or 'D'. But T2.col is not allowed to be 'D' if T1.col is 'B'. They have a many to one relationship of T1.PK = T2.FK. If I try to insert D in T2.col when its joining T1.col = 'B', it should fail.
I saw this but I'm not trying to do any aggregate function. My current attempt looks like this
CREATE FUNCTION dbo.CheckAddition()
RETURNS bit
AS BEGIN RETURN (
SELECT CASE
WHEN T2.col = 'C' THEN 1
WHEN T2.col = 'D' AND T1.col = 'A' THEN 1
ELSE 0
END AS 'Check'
FROM T1
INNER JOIN T2
ON T1.PK = T2.FK
) END
GO;
ALTER TABLE Shift ADD CONSTRAINT checkAdd CHECK (dbo.CheckAddition() = 1);
but since it's not an aggregate, I get this failure.
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Edit
My full tables look like this
CREATE TABLE [dbo].[T1](
[PK] [bigint] IDENTITY(1,1) NOT NULL,
[col] [char](1) NOT NULL,
CONSTRAINT [PK_T1] PRIMARY KEY CLUSTERED
(
[PK] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[T1] WITH CHECK ADD CONSTRAINT [CK_T1] CHECK (([col]='B' OR [col]='A'))
GO
ALTER TABLE [dbo].[T1] CHECK CONSTRAINT [CK_T1]
GO
CREATE TABLE [dbo].[T2](
[PK] [bigint] IDENTITY(1,1) NOT NULL,
[FK] [bigint] NOT NULL,
[col] [char](1) NOT NULL,
CONSTRAINT [PK_T2] PRIMARY KEY CLUSTERED
(
[PK] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[T2] WITH CHECK ADD CONSTRAINT [FK_T2_T1] FOREIGN KEY([FK])
REFERENCES [dbo].[T1] ([PK])
GO
ALTER TABLE [dbo].[T2] CHECK CONSTRAINT [FK_T2_T1]
GO
ALTER TABLE [dbo].[T2] WITH CHECK ADD CONSTRAINT [CK_T2] CHECK (([col]='D' OR [col]='C'))
GO
ALTER TABLE [dbo].[T2] CHECK CONSTRAINT [CK_T2]
GO
I'm trying to make it so T2.col can not be 'D', if the matching PK/FK in T1.col = 'A'