Простой SQL-код ускользает от меня..Объедините две несовпадающие таблицы
-
19-08-2019 - |
Вопрос
Я выбираю 1 поле из 1 таблицы и сохраняю его во временной таблице.
Иногда в этой таблице заканчивается 0 строк.
Я хочу добавить это поле в другую таблицу, содержащую более 20 полей
Обычный союз у меня не будет работать из-за поля # mismatch.Внешнее у меня не сработает, потому что сравнивать не с чем.NVL не работает с первой временной таблицей.
Кто-нибудь знает, как это сделать?
ОБНОВЛЕННЫЙ:
Я забыл упомянуть....Когда таблица, которая извлекает 1 поле, находит совпадение в других случаях, этот код, который я использую сейчас, работает....
SELECT DISTINCT reqhead_rec.resp_name<br>
FROM reqhead_rec, biglist<br>
WHERE reqhead_rec.req_no = biglist.req_no
AND reqhead_rec.frm = biglist.req_frm<br>
INTO TEMP grabname with no log;
SELECT biglist.*, grabname.resp_name<br>
FROM biglist, grabname<br>
ORDER BY prnt_item, account_amt<br>
INTO TEMP xxx with no log;
Решение
С каким полем это будет совпадать?Кстати, вот как их выстроить в ряд:
SELECT NULL, NULL, NULL, NULL, MySingleField, NULL, NULL, NULL... FROM #temp
UNION ALL
SELECT Col1, Col2, Col3, Col4, Col5, Col6,... FROM OtherTable
Обновить:
Хорошо, после прочтения вашего обновления...Я не думаю, что вам вообще нужно ОБЪЕДИНЕНИЕ, скорее, невероятно простой ПОДВЫБОР
SELECT
*,
(SELECT TOP 1 Name FROM Blah WHERE Blah.SomeID = MyTable.SomeID) AS ExtraCol
FROM
MyTable
Другие советы
Похоже, вы действительно хотите объединения, а не объединения.
Вам не нужно ничего сравнивать, чтобы выполнить объединение.В итоге вы получите перекрестный продукт, если не укажете условие соединения:
SELECT t20.*, t1.*
FROM table_with_20_columns AS t20
LEFT OUTER JOIN temp_table_with_1_column AS t1 ON (1=1);
Когда во временной таблице будет ноль строк, в результате приведенного выше запроса это будет указано как NULL.
Однако, если во временной таблице есть несколько строк, вы получите перекрестное произведение с первой таблицей.Я не могу понять из вашего вопроса, чего вы хотите.
Редактировать: Условие соединения, выраженное в ON
или USING
предложение должно быть необязательным в соответствии со стандартом SQL, но, по крайней мере, когда я тестирую его в MySQL 5.0, опускание этого предложения является синтаксической ошибкой.Но вы можете использовать ON (1=1)
.
Редактировать: Отвечаю на ваш вопрос в комментарии:
SELECT COALESCE(reqhead_rec.resp_name, dflt.resp_name) AS resp_name
FROM (SELECT 'default name' AS resp_name) dflt
LEFT OUTER JOIN reqhead_rec ON (1=1)
WHERE reqhead_rec.req_no = biglist.req_no AND reqhead_rec.frm = biglist.req_frm
INTO TEMP grabname WITH NO LOG;
На самом деле, вы можете вообще пропустить временную таблицу.Просто ОСТАЛОСЬ ПРИСОЕДИНИТЬСЯ к вашему основному столу, чтобы reahead_rec
.Поместите эти условия в ON
предложение объединения, а не в WHERE
оговорка.Затем используйте COALESCE()
в списке выбора этого запроса указать имя по умолчанию, если оно не найдено в другой таблице.
SELECT b.*, COALESCE(r.resp_name, 'default name') AS resp_name
FROM biglist AS b
LEFT OUTER JOIN reqhead_rec AS r
ON (b.req_no = r.req_no AND r.frm = b.req_frm)
INTO TEMP xxx WITH NO LOG;
Попробуйте выбрать nvl(NULL,NULL)
для поиска пропущенных значений