#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. Спасибо! Это действительно возвращает дублированные строки, но может быть решено путем добавления отдельной функции, чтобы она работала!