Как запросить несколько, где условия «НЕ Равны» - PullRequest
1 голос
/ 03 апреля 2019

Я пытаюсь выяснить, как откатить записи, где «Поле 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).

Ответы [ 3 ]

2 голосов
/ 03 апреля 2019

Вы можете попробовать использовать OR вместо AND

SELECT * 
FROM [#Temp]
WHERE  ([status] <> 'Scheduled' or [fkStatus] <> 'PreliminaryScheduled')
1 голос
/ 03 апреля 2019

Вы можете использовать оператор NOT.

SELECT * FROM [#Temp]
    WHERE [Date] < '2019-01-01'
        AND NOT ([status] = 'Scheduled'  AND [fkStatus] = 'PreliminaryScheduled')
1 голос
/ 03 апреля 2019

Отмените условие, которому записи не соответствуют, используя NOT:

SELECT * FROM #temp 
WHERE NOT ([status] = 'Scheduled'  AND [fkStatus] = 'PreliminaryScheduled')

В качестве альтернативы используйте OR:

SELECT * FROM #temp 
WHERE [status] <> 'Scheduled'  OR [fkStatus] <> 'PreliminaryScheduled'

Они оба приводят к одному и тому жеПлан запроса (используя ИЛИ), вы можете найти первый вариант немного более понятным.

...