2016-08-03 2 views
3

Я использую sql для создания пользовательского запроса ODBC в Excel.SQL-соединения перестают работать, когда определены столбцы таблицы

У меня есть 2 таблицы 'TBL_CONTACT' и 'TBL_ADDRESS', которые я хочу использовать в INNER JOIN на 'contactid', который является столбцом, который существует в обоих.

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

Рабочий код:

SELECT * FROM "TBL_CONTACT" AS CONTACT 

INNER JOIN (SELECT * FROM "TBL_ADDRESS" AS ADDRESS) ADDRESS 
ON CONTACT.contactid = ADDRESS.contactid 

Неработающий код:

SELECT CONTACT.contactid, CONTACT.fullname FROM "TBL_CONTACT" AS CONTACT 

INNER JOIN (SELECT * FROM "TBL_ADDRESS" AS ADDRESS) ADDRESS 
ON CONTACT.contactid = ADDRESS.contactid 

Это только показывает 'ContactID' и 'FullName' столбцы из 'TBL_CONTACT' и ничего не присоединиться с " TBL_ADDRESS.

Пример:

TBL_CONTACT 
contactid firstname fullname 
1001  John  John Smith 
1002  Tom   Tom Adams 

TBL_ADDRESS 
contactid line1  line2  postcode 
1001  3 Farm Ln Essex  AB1 1BA 
1002  1 Tim st Kent   CN2 2NC 

Желаемый результат:

contactid fullname  contactid2 line1  line2 postcode 
1001  John Smith 1001  3 Farm Ln Essex AB1 1BA 
1002  Tom Adams 1002  1 Tim st Kent  CN2 2NC 

первый код дает следующий результат:

contactid firstname fullname  contactid2 line1  line2 postcode 
1001  John   John Smith 1001  3 Farm Ln Essex AB1 1BA 
1002  Tom   Tom Adams 1002  1 Tim st Kent  CN2 2NC 

второй код дает следующий результат:

contactid fullname 
1001  John Smith 
1002  Tom Adams 

Я довольно новичок в SQL, но не уверен, что я делаю неправильно здесь. Любая помощь будет принята с благодарностью!

+1

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

+0

И записать имена таблиц перед именами полей в инструкции 'SELECT':' SELECT TBL_CONTACT.contactid, TBL_CONTACT.fullname, TBL_ADDRESS.fullname, TBL_ADDRESS.fullname' –

+0

указать имя псевдонима в столбце –

ответ

1

, присоединяющиеся к результатам таблицы в столбцах будут доступны для вашего выбора. Когда вы выберете все столбцы (с *, как и в вашем первом фрагменте кода), также будут выбраны столбцы вашей объединенной таблицы. Однако при ручном выборе столбцов вы также должны определить, какие столбцы вы хотите использовать в своей объединенной таблице.

Допустим, вы хотите иметь 2 колонки ContactId и ПолноеИмя из таблицы TBL_CONTACT и все столбцы из присоединяемой таблицы TBL_ADDRESS:

SELECT `TBL_CONTACT`.`contactid`, `TBL_CONTACT`.`fullname`, `TBL_ADDRESS`.* FROM TBL_CONTACT 
INNER JOIN TBL_ADDRESS 
ON `TBL_CONTACT`.`contactid` = `TBL_ADDRESS`.`contactid` 

Обратные кавычки не являются обязательными.

В качестве альтернативы вы также можете указать столбцы для объединенной таблицы.

+0

Большое вам спасибо! Я не оценил, что объединенная таблица должна быть включена в исходный оператор select. – Tom

0

Попробуйте

//MySQL 
SELECT TC.contactid,TC.fullname,TA.`address_table_column` 
FROM TBL_CONTACT TC 
INNER JOIN TBL_ADDRESS TA 
ON TC.contactid = TA.contactid 

//SQL Server 
SELECT TC.contactid,TC.fullname,TA.[address_table_column] 
FROM TBL_CONTACT TC 
INNER JOIN TBL_ADDRESS TA 
ON TC.contactid = TA.contactid 
+0

адрес? @Thomas вообще не упоминал об этом поле –

+0

Я только что поставил для справки, как работает псевдоним –

+2

Квадратные скобки для идентификаторов с разделителями являются специфическими для MS SQL Server. MySQL имеет обратные тики. (И ANSI SQL имеет двойные кавычки, например «адрес».) – jarlh

0

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

Поскольку, как и в вашем случае, одно и то же поле может быть в обеих таблицах, а затем mysql не знает, какой из них выбрать.

Так просто использовать префикс таблиц в запросе и, конечно, SELECT все поля, которые вы хотите:

SELECT `TBL_CONTACT`.`contactid`,`TBL_CONTACT`.`fullname`,`TBL_ADDRESS`.`contactid` as contactid2,`TBL_ADDRESS`.`line1`,`TBL_ADDRESS`.`line2`,`TBL_ADDRESS`.`postcode` FROM `TBL_CONTACT`   
    INNER JOIN `TBL_ADDRESS` 
    ON `TBL_CONTACT`.`contactid` = `TBL_ADDRESS`.`contactid` 
+0

Спасибо, но это все еще не дает мне объединенные столбцы - я добавил несколько подробностей к моему оригинальному вопросу, если это поможет. – Tom

+0

«Это показывает только столбцы« contactid »и« fullname »из« TBL_CONTACT »и ничего не связывает с« TBL_ADDRESS »». ..... Actucally It DOES join, но, конечно, он показывает, что вы выбрали .... Просто 'SELECT' все поле, которое вы хотите. Я обновил свой ответ ... –

+0

Спасибо, это имеет смысл для меня сейчас. – Tom

0
SELECT contact.*, ADDRESS.* FROM "TBL_CONTACT" contact INNER JOIN "TBL_ADDRESS" ADDRESS ON contact.contactid = ADDRESS.contactid; 
+1

Хотя это может решить проблему OP, было бы лучше предоставить некоторый контекст того, что вы на самом деле зафиксировали. – GergelyPolonkai

Смежные вопросы