sql查询错误没有数据显示

时间:2017-03-06 15:52:57

标签: sql sql-server

我需要从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

加入有效,但没有一个显示数据。

有人可以帮忙吗? 提前谢谢。

2 个答案:

答案 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;