Я пытаюсь выяснить, как откатить записи, где «Поле A» и «Поле B» не могут быть комбинацией набора.
Пример: Поле A не может быть равно «Запланировано», в то время как Поле B равно «Предварительное расписание»
Но я хочу увидеть другие записи, где Поле A = «Запланировано» и Поле B = «Предварительное планирование»
Я надеюсь, что это имеет смысл, пожалуйста, посмотрите скрипт ниже, я включил очень простую временную таблицу, созданную с примерами того, чего я пытаюсь достичь, у меня есть обходной путь с использованием CONCAT, но я не думаю, что это лучшее решение?
Я знаю, что могу исключить их, выполнив там, где не существует, но в реальной базе данных это будет большая таблица, и я бы предпочел не делать двойной запрос на это.
У меня также есть обходной путь, но я хотел бы знать, есть ли правильный / лучший способ выполнения этой задачи.
Пожалуйста, смотрите код и комментарии.
--=============================
-- Create Table
--=============================
CREATE TABLE #Temp
(
[id] INT IDENTITY(1,1),
[status] nvarchar(100),
[fkstatus] NVARCHAR(200),
[Date] DATE
)
--=============================
-- Insert Into Table
--=============================
INSERT INTO [#Temp]
(
[status],
[fkstatus],
[Date]
)
VALUES
(N'Scheduled', N'PreliminaryScheduled', GETDATE()), (N'Scheduled', N'PreliminaryScheduled', '2019-01-01'), (N'Cancelled', N'PreliminaryScheduled', '2019-02-01'), (N'Complete', N'PreliminaryScheduled', GETDATE()), (N'Scheduled', N'Other', '2019-03-01')
--=============================
--(A)
-- Brings back what I DO NOT want, these are the items that I want to exclude.
--=============================
SELECT *
FROM [#Temp]
WHERE ([status] = 'Scheduled' AND [fkStatus] = 'PreliminaryScheduled')
--=============================
-- (B)
-- Real world logic, I beleive this should work?.....
--=============================
SELECT *
FROM [#Temp]
WHERE ([status] <> 'Scheduled' AND [fkStatus] <> 'PreliminaryScheduled')
--=============================
-- (C)
-- Work Around - Or is this the actual way this has to be done?
--=============================
SELECT *
FROM [#Temp]
WHERE CONCAT([status],'-',[fkstatus]) <> 'Scheduled-PreliminaryScheduled'
--=============================
-- (D)
-- Additional with a Date.
--=============================
SELECT *
FROM [#Temp]
WHERE ([status] <> 'Scheduled' or [fkStatus] <> 'PreliminaryScheduled')
AND [Date] < '2019-01-01'
- Я ожидаю, что это вернет результаты из точки (C), но с учетом (D).