Чтобы найти одно и то же значение в разных строках и разных столбцах (SQL)

#sql-server

#sql-сервер

Вопрос:

Извините, я пропустил одно условие ранее (добавлено курсивом и жирным шрифтом)

У меня есть таблица с несколькими тысячами строк, и я хотел бы извлечь тексты из определенных столбцов, если в разных столбцах есть совпадающие значения.

Например:

A B C D E
зубы MrA 123 азбука $128
нос MrB CDE 789 $100
рука MrC азбука 456 $128
глаз MrD EFG 789 $110

Ожидаемый результат-если какое-либо значение C = D или наоборот, и с тем же значением E, то запрос должен возвращать значения из столбца A и столбца B или всей строки.

Результаты были бы:

A B C D E
зубы MrA 123 азбука $128
рука MrC азбука 456 $128

поскольку C совпадает с D на ABC и E = 128 долларов, что одинаково для обеих строк.

Запрос, который я пробовал до сих пор, может возвращать значение только в том случае, если C amp; D имеют одинаковое значение в одной строке. Ценю помощь в этом, спасибо!

Комментарии:

1. ВЫБЕРИТЕ * ИЗ ТАБЛИЦЫ MyTable как t1, ЧТОБЫ ПРИСОЕДИНИТЬСЯ К ТАБЛИЦЕ MyTable как t2 НА t1.C = t2.D ИЛИ t1.A = t2.B

2. Добавляя комментарий @SebastianS, вам также нужно исключить текущую строку на основе первичного ключа из-за самостоятельного соединения. Предполагая, что первичный ключ является составным ключом на A и B: AND t1.A lt;gt; t2.A AND t1.B lt;gt; t2.B .

3. К вашему сведению, изменение вашего вопроса после того, как вы получили ответы, не одобряется; если вам нужно, вы должны задать новый вопрос.

Ответ №1:

Вероятно, самый простой способ-это использовать exists

 select *  from t where exists (select * from t t2 where t.c=t2.d or t.d=t2.c)  

Ответ №2:

Помимо ответа Стью, вы также можете использовать перекрестное соединение, но вам нужно следить за производительностью запросов.

 select t2.* --or t.* from Trt t cross join Trt t2 where t.C = t2.D or t.D = t2.C;  

Комментарии:

1. Спасибо! Это действительно возвращает дублированные строки, но может быть решено путем добавления отдельной функции, чтобы она работала!