简单的SQL代码逃避了我.. Unionize两个不匹配的表

时间:2008-12-04 20:59:55

标签: sql join union sql-update

我从1个表中选择1个字段并将其存储到临时表中。

有时该表最终会有0行。

我想将该字段添加到另一个包含20多个字段

的表中

由于字段#matmatch不合适,常规联合对我不起作用。 外面不适合我,因为没有什么可比的。 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 个答案:

答案 0 :(得分: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。

但是,如果临时表中有多行,您将获得第一个表的叉积。我无法从你的问题中看出你想要什么。

编辑:根据SQL标准,ONUSING子句中表示的连接条件应该是可选的,但至少我在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;

答案 1 :(得分:3)

它会匹配哪个字段?顺便说一下,这是如何排列它们的:

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

答案 2 :(得分:1)

尝试选择nvl(NULL,NULL)表示缺失值