2015-03-13 2 views
2

Как говорится в названии, я пытаюсь использовать INNER JOIN для столбцов, которые имеют разные значения/типы данных.Возможно ли ввести INNER JOIN 2 id другого типа/значений?

В одной таблице базы данных назовем ее. Таблица A Я хочу сделать оператор select, чтобы получить значения нескольких столбцов (Subject, Name, Description, Date). Хотя я также хочу имя отношения. Однако проблема состоит в том, что имя отношения (которое задано в таблице отношений, таблица B) отображается в таблице A в виде строкового значения (D0001001) - так что это не как буквальное имя.

Чтобы получить литеральное имя отношения, существует ссылка с таблицей B, в которой есть столбец идентификатора 1001 - 1000 ~ и столбец имени 'literal'. Так, например, в таблице B ID 1001 соответствует название компании MC DONALDS, а в таблице A RelationID - D0001001 (MC DONALDS).

Не спрашивайте меня, почему RelationID в таблице A находится со странным D000 перед ним, я тоже не знаю, но у него была какая-то функциональность.

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

Вопрос в том, как я могу INNER JOIN использовать эти 2 разных значения/типа? RelationID в таблице A имеет строковый тип (nvarchar, если быть точным), а в таблице B ID, который соответствует названию отношения, является типом Integer.

Я думал, что я мог бы исправить это:

  1. Сделайте LIKE заявление в запросе, в котором идентификатор таблицы B (1001 целое) частично совпадает с RelationID из таблицы А (D0001001 строка). Это, однако, не работает

  2. сделать заявление REPLACE, заменив значения RelationID 'D000' ничем: "". Это, вероятно, все равно потребует некоторого рода приведение в целое число для значения таблицы A. Возможно, возникла некоторая ошибка из-за синтаксической ошибки.

То, что я до сих пор:

SELECT 
    TableA.subject, TableA.Name, TableA.Description, TableA.Date, 
    TableB.RelationName 
INNER JOIN 
    TableB ON TableA.RelationID = TableB.ID 

Это возвратило преобразование, которое не представляется возможным (строка/целое).

Итак, я попробовал:

SELECT 
    TableA.subject, TableA.Name, TableA.Description, TableA.Date, 
    TableB.RelationName 
INNER JOIN 
    TableB ON TableB.ID LIKE '% TableA.RelationID %' 

Это не работает либо (EOF).

Чтобы сделать это немного понятнее мои таблицы:

Таблица A + ------------ + ----------- + - ---------------- + --------------------- + ----------- + | RelationID | Тема | Описание | Имя | Дата | + ------------ + ----------- + ------------------ + ---- ----------------- + ----------- + | D0001001 | Быстрое питание | Некоторые описания | Название заполнителя формы | 13-3-2015 | | D0001002 | Напитки | Некоторые описания | Название заполнителя формы | 10-3-2015 | | D0001003 | Автомобили | Некоторые описания | Название заполнителя формы | 7-3-2015 | + ------------ + ----------- + ------------------ + ---- ----------------- + ----------- +

Таблица B

+------+--------------+ 
| ID | RelationName | 
+------+--------------+ 
| 1001 | MC DONALDS | 
| 1002 | COCA COLA | 
| 1003 | MERCEDES  | 
+------+--------------+ 

-> INNER присоединяется in ID и RelationID

Любые альтернативы? Заранее спасибо!

+0

вы можете использовать конструктор 'like' – Sim1

+0

Каким будет значение 'RelationID' после' D0009999' –

ответ

4

Чтобы уйти от ошибки Convertion удалить первые символы в RelationID с помощью Substring затем convertRelationID к INT затем JOIN с ID колонки в tableA

SELECT TableA.subject, 
     TableA.Name, 
     TableA.Description, 
     TableA.Date, 
     TableB.RelationName 
FROM tableA 
     INNER JOIN TableB 
       ON CONVERT(INT, Substring(TableA.RelationID, 2, Len(TableA.RelationID))) = TableB.ID 
+0

Благодарим вас за ответ! И все в этом отношении! Будет проверять его как можно скорее. – Nicolas

1

Сделайте LIKE заявление в запросе, где Идентификатор таблицы B (1001 integer) частично соответствует идентификатору отношения таблицы A (строка D0001001). Это, однако, не сработало.

Попробуйте наоборот:

SELECT TableA.Subject, 
     TableA.Name, 
     TableA.Description, 
     TableA.Date, 
     TableB.RelationName 
FROM TableA 
INNER JOIN TableB ON TableA.ID LIKE '%' + CAST(TableB.RelationID AS NVARCHAR(50)) + '%' 
1
SELECT TableA.subject, TableA.Name, TableA.Description, TableA.Date, TableB.RelationName1 
FROM TableA -- insert this line here 
INNER JOIN TableB 
ON TableB.ID LIKE '%TableA.RelationID%' 

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

Если столбец RelationalID всегда имеет одно и то же дополнение, я бы рассмотрел возможность его вырезания из строки. С чем-то вроде:

ON TableB.ID = RIGHT(TableA.RelationalID,4) 

SQL должен сделать преобразование из строки в целое число для вас делает неявное приведение типа в сравнении. Если не просто добавить отлитую заявление:

ON TableB.ID = CAST(RIGHT(TableA.RelationalID,4) AS INT) 
1

Вы можете использовать LIKE в INNER JOIN, но это собирается замедлить производительность вашего запроса, так как LIKE иногда препятствует эффективному использованию индекса.