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

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

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

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

Обычное объединение у меня не сработает из-за несоответствия # поля. Внешний вид у меня не подойдет, потому что сравнивать не с чем. NVL не работает с первой временной таблицей.

Кто-нибудь знает, как это сделать?

ОБНОВЛЕНО:

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

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;

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

Andrew Rollings 05.12.2008 00:03

в первой таблице есть много информации о заказах на поставку, вторая таблица просто находит имя из другой таблицы, соответствующей ему в двух полях, иногда запросы на покупку создаются без соответствующей информации Могу ли я просто установить что-то по умолчанию в случае, если строки не найдены?

CheeseConQueso 05.12.2008 00:15
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
889
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Похоже, вы действительно хотите присоединения, а не союза.

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

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;

Вам нужно предложение «ON», иначе вы получите сообщение об ошибке ... вы можете присоединиться к «ON 1 = 1».

Timothy Khouri 05.12.2008 00:12

Я предполагаю, что мне действительно следует спросить, как я могу заполнить поле значением по умолчанию, если запрос не дал результатов? исходный запрос .. ВЫБЕРИТЕ reqhead_rec.resp_name FROM reqhead_rec ГДЕ reqhead_rec.req_no = biglist.req_no И reqhead_rec.frm = biglist.req_frm INTO TEMP grabname БЕЗ ЖУРНАЛА;

CheeseConQueso 05.12.2008 00:12

Я получаю синтаксическую ошибку в открытой кавычке для имени по умолчанию ... я не использую mysql, и иногда синтаксис подпрограмм не работает в версии, которую я использую ... я буду продолжать пытаться это, хотя, спасибо .... я отредактировал исходный вопрос с использованием sql im сейчас

CheeseConQueso 05.12.2008 01:04

я получаю синтаксические ошибки с подпрограммой coalesce ... я использую informix, хотите верьте, хотите нет ... но большое спасибо за вашу помощь ... очень признателен

CheeseConQueso 05.12.2008 01:13

Вау, это довольно слабо. Coalesce - это стандартная функция SQL. Может быть, в Informix есть функция для выполнения аналогичных действий, например IFNULL () или NVL () или что-то в этом роде.

Bill Karwin 05.12.2008 01:37

nvl существует, но не сработал по неизвестной причине .. поэтому я разместил этот вопрос

CheeseConQueso 19.12.2008 00:43
Ответ принят как подходящий

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

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

ОБНОВИТЬ:

Хорошо, после прочтения вашего обновления ... Я не думаю, что вам вообще нужен UNION, а, скорее, невероятно простой SUBSELECT

SELECT
    *,
    (SELECT TOP 1 Name FROM Blah WHERE Blah.SomeID = MyTable.SomeID) AS ExtraCol
FROM
    MyTable

мне нужно добавить поле в таблицу, первая таблица имеет 73 поля, ей нужно # 74, что является чьим-то именем из другой таблицы

CheeseConQueso 05.12.2008 00:28

спасибо .. подвыбор сработал !!! "2 строки извлечены". никогда не выглядел так хорошо ...

CheeseConQueso 05.12.2008 01:12

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

Другие вопросы по теме