2012-04-16 2 views
1

Я хочу выполнить простое соединение на двух таблицах после подключения двух столбцов с идентификаторами на одной из этих таблиц.JOIN on Subquery

Первый шаг:

SELECT cars.hhid & cars.vmid 
FROM cars 

Теперь я хочу, чтобы сравнить этот результат с другой таблицей (table2).

Новый результат должен быть в каждой строке таблицы1 (автомобили), соответствующей ID в таблице2.

Что случилось?

Мой код:

SELECT Cars.* 
FROM (SELECT Cars.hhid & Cars.vmid AS zid 
FROM cars) x 
JOIN table2 ON table2.id = x.zid; 

ответ

2

Из того, что вы сказали в вопросе, я не понимаю, зачем вам нужен подзапрос.

Попробуйте это:

select cars.* 
from cars 
inner join table2 on cstr(table2.id) = cars.hhid & cars.vmid 

(протестировано сdoubleкак тип данных для всех трех полеев)

Вам не нужен подзапрос, потому что вы можете поместить свои «подключенные колонки» непосредственно в пункт JOIN (конечно, вы можете поместить их в пункт SELECT, если они вам понадобятся).

Однако, как только вы конкатенации столбцы, Access, кажется, рассматривать их как string, так что вы не можете присоединиться к ним непосредственно на double колонке в table2.
Вот почему вам нужно преобразовать столбец из таблицы2 в строку с CStr().

+0

Эй, христианин, спасибо за ваше объяснение. Ваш код делает именно то, что я хочу сделать. Вы, ребята, великолепны! – Simon

+0

@Simon: Если бы мой ответ был полезен для вас, было бы неплохо, если бы вы [приняли] (http://stackoverflow.com/faq#howtoask) его. Спасибо! –

+0

Спасибо за подсказку. Это мой первый вопрос. Это работает? – Simon

1

* Ответ на TSQL, до изучения его было MS-Access *

SQL не имеет тип double данных, поэтому вам необходимо использовать поплавок.

Чтобы использовать оператор конкатенации + значения должны быть преобразованы в строки с помощью CAST или CONVERT

данных:

declare @cars table (hhid float, vmid float) 
declare @table2 table (id float) 

insert @cars values (1,1),(2,2) 
insert @table2 values (11),(22),(12),(21) 

Запрос:

SELECT x.* 
FROM (
    SELECT CAST(c.hhid AS nvarchar(20)) + CAST(c.vmid AS nvarchar(20)) AS zid 
    FROM @cars c 
    ) x 
INNER JOIN @table2 t ON t.id = x.zid 

* Попытка MS-Access *

ли эту работу лучше, для меня это выглядит, как ваши ссылки стол слегка отжать

SELECT x.* 
FROM (SELECT c.hhid & c.vmid AS zid 
FROM cars c) x 
JOIN table2 t ON t.id = x.zid; 
+0

Большое спасибо за быстрый ответ. Тип данных для hhid, vmid (на таблицах 'cars') и id (on table2) равен double – Simon

+0

Обновлен ответ для типа double \ float – Paddy

+0

Iam, используя (немецкий) MS-Access, и отвечает на ошибку: Unzulässige SQL-Anweisung; «УДАЛИТЬ», «ВСТАВИТЬ», «ВЫБРАТЬ», «ПРОЦЕДУЮ», или «ОБНОВИТЬ» erwartet. означает: SQL-Statement неверен, Access ищет DELETE ',' INSERT ',' SELECT ',' PROCEDURE 'или' UPDATE ' – Simon

1

Попробуйте

SELECT x.* 
FROM (SELECT Cars.hhid & Cars.vmid AS zid 
FROM cars) x 
INNER JOIN table2 ON table2.id = x.zid; 

MS Access как тип присоединиться быть указан.

+0

thx 4 помощь. Я попробовал ваш запрос (с буквой c как маленьким шрифтом). К сожалению, все еще не работает. – Simon

+1

@Simon is table2.id текстовое поле? – Fionnuala