Простой SQL-код ускользает от меня..Объедините две несовпадающие таблицы

StackOverflow https://stackoverflow.com/questions/342044

  •  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) для поиска пропущенных значений

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top