我需要从sql数据库中的2个表中选择所有数据。 我搜索了网站并干了许多方法,但没有成功。 一个表没有数据,但另一个表充满了它。 如果我单独选择每一个,我会得到很好的结果,但如果我使用例如:
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
加入有效,但没有一个显示数据。
有人可以帮忙吗? 提前谢谢。
答案 0 :(得分:2)
问题中的所有三个选择语句都是交叉连接。 仅当两个表至少有一行时,交叉连接才会返回数据。 它返回两个表的笛卡尔积,这意味着一个表中的每一行都将连接到另一个表中的每一行。
一个表没有数据,但另一个表已满了。
由于您的某个表为空,因此根本不会返回任何结果。您可以将其视为乘以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
答案 1 :(得分:1)
如果要返回所有匹配和不匹配的行,请使用Full Outer Join.FULL OUTER JOIN关键字返回左表(table1)和右表(table2)中的所有行。
FULL OUTER JOIN关键字组合了LEFT和RIGHT联接的结果。
在SQL中,FULL OUTER 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生成一个结果集,如果没有与CROSS JOIN一起使用WHERE子句,则该结果集是第一个表中的行数乘以第二个表中的行数。这种结果称为笛卡尔积。
如果WHERE子句与CROSS JOIN一起使用,则其功能类似于INNER JOIN。
实现相同结果的另一种方法是在SELECT之后使用以逗号分隔的列名,并在FROM子句之后提及所涉及的表名。
CROSS JOIN SYNTAX
SELECT *
FROM table1
CROSS JOIN table2;