Возврат результатов из разных таблиц в зависимости от условий из двух других таблиц - PullRequest
0 голосов
/ 08 мая 2018

У меня есть 4 таблицы (table1-table4), содержащие имена и значения, связанные с этими именами, например:

table1

ID  Name_1  Name_2

1   Jeff    Jeff

2   Nancy   Jasmine

table2

ID  Name_1  Name_2

3   Jeff    Jeff

4   Nancy   Nancy

Таблица3

Name  Value

Jeff   5.5

Nancy  6.5

1012 * Таблица 4 *

Name  Value

Jeff  7.5

Nancy 8.5

Мне нужно получить ID # из таблицы 1 и значение из таблиц 3 ИЛИ 4 в зависимости от того, как имена расположены между таблицами 1 и 2 (будут другие таблицы, из которых можно получить возвращаемое значение, но сейчас я просто пытаюсь прибить 2).

Пример .... В приведенных выше таблицах Джефф появляется дважды в таблице 1 и дважды в таблице 2, поэтому я хочу вернуть идентификатор № 1 из таблицы 1 со значением 5,5 из таблицы 3, в то время как Нэнси появляется один раз в таблице 1 и дважды в таблице 2, поэтому Я хочу вернуть идентификатор № 2 из таблицы 1 и значение 8,5 из таблицы 4. Всего так:

ID  Value

1   5.5  (based on the sharing between table1 and table 2 return value from table 3)

2   8.5 (based on the sharing between table1 and table 2 return value from table 4)

у меня есть:

SELECT dbo.table1.ID
    CASE
    WHEN((dbo.table2.Name_1)=(dbo.table2.Name_2) AND
        (dbo.table1.Name_1)=(dbo.table1.Name_2) AND
        (dbo.table2.Name_1)=(dbo.table1.Name_1) AND
        (dbo.table2.Name_2)=(dbo.table1.Name_2) AND
        (dbo.table2.Name_1)=(dbo.table1.Name_2) AND
        (dbo.table2.Name_2)=(dbo.table2.Name_1)) THEN (SELECT dbo.table3.Value FROM dbo.table3 WHERE dbo.table3.Name = dbo.table2.Name_1)
    ELSE Null
    END AS Value
FROM dbo.table1, dbo.table3
INNER JOIN dbo.table2 ON dbo.table3.Name = dbo.table2.Name_1

Что возвращается, так это:

ID#  Value

1    5.5

2    NULL

Существует еще больше способов совместного использования имен между таблицами 1 и 2, и мне нужны значения, возвращаемые из соответствующих таблиц, в зависимости от общего доступа.

Если бы я хотел вернуть Нэнси, я бы написал следующий запрос так:

SELECT dbo.table1.ID
    CASE
    WHEN((dbo.table2.Name_1)=(dbo.table2.Name_2) AND
        (dbo.table1.Name_1)<>(dbo.table1.Name_2) AND
        (dbo.table2.Name_1)=(dbo.table1.Name_1) AND
        (dbo.table2.Name_2)<>(dbo.table1.Name_2) AND
        (dbo.table2.Name_1)<>(dbo.table1.Name_2) AND
        (dbo.table2.Name_2)=(dbo.table2.Name_1)) THEN (SELECT dbo.table4.Value FROM dbo.table4 WHERE dbo.table4.Name = dbo.table2.Name_1)
    ELSE Null
    END AS Value
FROM dbo.table1, dbo.table4
INNER JOIN dbo.table2 ON dbo.table4.Name = dbo.table2.Name_1

Я получаю:

ID#  Value

1    NULL

2    8.5

Что касается меня, я не могу понять, как объединить их в один результат, подобный этому:

ID#  Value

1    5.5

2    8.5

У кого-нибудь есть идеи о том, как я могу это сделать или какие изменения я могу внести в то, что я должен сделать? Сначала я попытался добавить несколько случаев, но поскольку мне нужно было выбрать одну из двух таблиц и объединить их, это просто не сработало (или, по крайней мере, я не знаю, как это сделать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...