2016-09-04 3 views
-1

В SQL Server 2016 у меня есть таблица с двумя столбцами varchar, содержащими имена сравниваемых вещей (скажем, SUBJECT и COMP). Поскольку значения сравнения одинаковы, если A-> B или B-> A, нет смысла хранить оба, поэтому я сохраняю только A-> B. Это порождает новую проблему на SELECT. В основном:Выберите логику на двух взаимозаменяемых столбцах

CREATE TABLE myTable(Subject varchar(50), Comp varchar(50)) 

INSERT INTO myTable(Subject, Comp) values ('SDSD', 'CFGT') 
INSERT INTO myTable(Subject, Comp) values ('FMIP', 'ABLQ') 
INSERT INTO myTable(Subject, Comp) values ('FMIP', 'FMIP') 

DECLARE @sub varchar(50), @comp varchar(50) 
SET @sub = 'ABLQ', @comp = 'FMIP; 

Я не могу показаться, чтобы выяснить, как сказать «Дайте мне строку, в которой сочетание„ABLQ“и„FMIP“может существовать в любом столбце, но эти две колонки должны содержать как (другими словами, «ABLQ»/«ABLQ» и «FMIP»/«FMIP» не вернутся, но оба «ABLQ»/«FMIP» и «FMIP»/«ABLQ» будут - или я должен сказать, , потому что только один из двух будет на самом деле существует. Я попробовал несколько комбинаций, и не могу показаться, чтобы получить это право в логическом отделении. Я в конечном итоге с чем-то вроде

SELECT * 
FROM myTable 
WHERE (Subject = @sub OR Comp = @sub) 
    AND (Subject = @comp OR Comp = @Comp) 
    AND (Subject <> @sub AND Comp <> @comp) 

Любые мысли?

ответ

1

Просто убедитесь, что обе колонки не равны после того, как у вас есть строка с правильными значениями:

SELECT * FROM myTable 
WHERE 
    ([email protected] OR [email protected]) AND 
    ([email protected] OR [email protected]) AND 
    (Subject <> Comp) 
+0

Спасибо! Бог, который кажется таким очевидным сейчас, но после 36 часов на клавиатуре, я не уверен, как меня зовут. Я очень ценю вашу помощь в том, чтобы указать на очевидное для меня. –

0

я был бы склонен писать логику:

SELECT t.* 
FROM myTable t 
WHERE (Subject = @sub AND Comp = @comp) OR 
     (Subject = @comp AND Comp = @sub) ; 

Я нахожу эту формулировку легче следовать.

Смежные вопросы