2017-03-06 73 views
0

我需要从sql数据库中的2个表中选择所有数据。 我搜索了网站,干了很多方式,但没有成功。 一张桌子没有数据,但另一张已满。 如果我单独选择每一个我得到了良好的效果,但如果我使用例如:sql查询错误没有数据显示

select * from relatorio cross join temp 

select * from relatorio r,temp t 

甚至:

select t.*, r.* from temp t inner join relatorio r on 1=1 

的参加作品,但没有其中显示数据。

谁能帮助? 在此先感谢。

+1

试试'LEFT JOIN' – HoneyBadger

+0

@HoneyBadger听起来更像是一个'FULL JOIN'。虽然我不明白只是盲目执行表格之间的笛卡尔积 – Lamak

+0

^^^正确。 INNER JOIN不起作用,因为它只会返回包含在两个表中的数据。 –

回答

2

的问题全部三个select语句是交叉连接。 仅当两个表至少有一行时,交叉连接才返回数据。 它返回两个表的笛卡尔乘积,这意味着一个表中的每一行都将连接到另一个表中的每一行。

一个表没有数据,但另一个表已满。

由于其中一个表为空,它将根本不返回任何结果。你可以把它看作是以0为单位的乘法。

现在,你有两种选择:一种是使用一个完整的加盟,另一种是用左连接,在这种情况下都将返回相同的结果,因为一个表是空的:

select * 
from relatorio 
left join temp on <join condition> -- assuming temp is the empty table 

select * 
from relatorio 
full join temp on <join condition> -- in this case, it doesn't matter what table is empty 
+0

令人惊叹的,就是这样。 我使用了第二个选项。 谢谢 – septaug

1

如果要返回所有匹配和不匹配的行,请使用Full Outer Join。FULL OUTER JOIN关键字返回左表(table1)和右表(table2)中的所有行。

FULL OUTER JOIN关键字结合了LEFT和RIGHT连接的结果。

在SQL中,FULL OUTER JOIN结合了左外连接和右外连接的结果,并从join子句两边的表中返回所有(匹配或不匹配)行。

SQL FULL OUTER JOIN语法

SELECT column_name(s) 
FROM table1 
FULL OUTER JOIN table2 
ON table1.column_name=table2.column_name; 

的SQL CROSS JOIN产生一个结果集,它是行中的第一个表,如果没有WHERE在第二个表乘以行数的数子句与CROSS JOIN一起使用。这种结果被称为笛卡儿积(Cartesian Product)。

如果WHERE子句与CROSS JOIN一起使用,则其功能类似于INNER JOIN。

实现相同结果的一种替代方法是在SELECT之后使用以逗号分隔的列名,并在FROM子句之后提及涉及的表名。

CROSS JOIN语法

SELECT * 
FROM table1 
CROSS JOIN table2;