Простой код SQL уклоняется от меня .. Объединить две несоответствующие таблицы - PullRequest
1 голос
/ 04 декабря 2008

Я выбираю 1 поле из 1 таблицы и сохраняю его во временной таблице.

Иногда эта таблица заканчивается 0 строками.

Я хочу добавить это поле в другую таблицу с 20+ полями

Регулярный союз не будет работать для меня из-за несоответствия поля. Внешний не будет работать для меня, потому что не с чем сравнивать. 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;

Ответы [ 3 ]

3 голосов
/ 05 декабря 2008

Какое поле будет соответствовать? Кстати, вот как выстроить их в ряд:

SELECT NULL, NULL, NULL, NULL, MySingleField, NULL, NULL, NULL... FROM #temp
UNION ALL
SELECT Col1, Col2, Col3, Col4, Col5, Col6,... FROM OtherTable

UPDATE:

ОК, после прочтения вашего обновления ... Я не думаю, что вам нужен СОЮЗ, а скорее просто невероятно простой.

SELECT
    *,
    (SELECT TOP 1 Name FROM Blah WHERE Blah.SomeID = MyTable.SomeID) AS ExtraCol
FROM
    MyTable
3 голосов
/ 05 декабря 2008

Звучит так, будто вы хотите объединение, а не объединение.

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

SELECT t20.*, t1.*
FROM table_with_20_columns AS t20
  LEFT OUTER JOIN temp_table_with_1_column AS t1 ON (1=1);

Если в таблице temp есть ноль строк, в результате вышеприведенного запроса она будет указана как NULL.

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

edit: Условие соединения, выраженное в предложении ON или USING, должно быть необязательным в соответствии со стандартом SQL, но, по крайней мере, когда я проверяю его в MySQL 5.0, это синтаксическая ошибка для опустить этот пункт. Но вы можете использовать ON (1=1).

edit: Отвечая на ваш вопрос в комментарии:

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;
1 голос
/ 26 ноября 2010

Попробуйте выбрать nvl(NULL,NULL) для пропущенных значений

...