SQL-запрос для объединения нескольких столбцов

Я пытаюсь объединить данные из двух таблиц, но в нескольких столбцах. вот пример:

Исходная таблица

ID | Desc | AAAA | BBBB |

Таблица2 таблица

ID | Текст | ID1 | ID2 | ID3 |

где ID1, ID2 и ID3 в таблице2 - это идентификаторы из исходной таблицы.

Я хочу выполнить запрос, который даст результаты:

Table2.Text,
Source.Desc(ID1),
Source.AAAA(ID1),
Source.Desc(ID2),
Source.AAAA(ID2),
Source.Desc(ID3),
Source.AAAA(ID3)

Я предполагаю, что это будет соединение, но я не могу правильно понять синтаксис ... или мне было бы лучше с Union?


person geocoin    schedule 18.05.2009    source источник


Ответы (4)


Если не все исходные таблицы заполнены в Table2, это все равно даст вам частичные результаты:

SELECT
    t.Desc, s1.Desc, s1.AAAAA, s2.Desc, s2.AAAAA, s3.Desc, s3.AAAA
    FROM Table2                t
        LEFT OUTER JOIN Source s1 ON t.ID1 = s1.ID
        LEFT OUTER JOIN Source s2 ON t.ID2 = s2.ID
        LEFT OUTER JOIN Source s3 ON t.ID3 = s2.ID
    WHERE t.ID=@YourIDHere
person KM.    schedule 18.05.2009
comment
Это реальный случай в моем сценарии - person geocoin; 18.05.2009

Вы могли бы просто использовать несколько соединений, не так ли? Например:

SELECT tb.Desc, s1.Desc, s1.AAAAA, s2.Desc, s2.AAAAA, s3.Desc, s3.AAAA
FROM Table2 tb
    INNER JOIN Source s1 ON tb.ID1 = s1.ID
    INNER JOIN Source s2 ON tb.ID2 = s2.ID
    INNER JOIN Source s3 ON tb.ID3 = s2.ID
person Scott Anderson    schedule 18.05.2009
comment
дополнительно: чтобы получить точные результаты, которые мне нужны, я использовал левые внешние соединения, но это только моя конкретная ситуация. - person geocoin; 18.05.2009

Вам нужно присоединиться к исходной таблице три раза, по одному для каждого идентификатора. Вы также можете попробовать unuion, чтобы узнать, какой из них работает лучше.

Это плохой дизайн таблицы (он должен быть нормализован), и я бы посоветовал вам изменить его сейчас, если это вообще возможно. Там shoudl bea связанная таблица с каждым идентификатором в отдельной записи, тогда вы могли бы присоединиться один раз, и было бы намного эффективнее и намного проще писать код, и вам не пришлось бы менять структуру таблицы и все запросы в тот день, когда вам нужно ID4.

person HLGEM    schedule 18.05.2009

Три соединения должны помочь:

select A.*, coalesce(B1.Text,B2.Text,B3.Text,'') as Text
from Source A
inner join Table2 B1 on B1.ID1=A.ID
inner join Table2 B2 on B2.ID2=A.ID
inner join Table2 B3 on B3.ID3=A.ID
person Stijn Sanders    schedule 18.05.2009