SQL - 内连接2表,但如果1表空,则返回所有表

时间:2013-03-07 07:09:48

标签: sql join left-join inner-join

我有两张桌子说A和B,我想加入它们。

表A将始终包含记录。

当表B中有行时,我希望查询转换表A和表B匹配的所有行。 (即表现得像内部联接)

但是,如果表B为空,我想从表A返回所有内容。

这可以在1个查询中完成吗?

感谢。

8 个答案:

答案 0 :(得分:12)

是的,对于这样的结果,请使用LEFT JOIN

基本上INNER JOIN的作用是它只返回在另一个表上至少有一个匹配的行。另一方面,LEFT JOIN会返回左侧表中的所有记录,无论它在另一个表上是否匹配。

要进一步了解联接,请访问以下链接:

答案 1 :(得分:5)

我遇到了同样的问题,因为它从未得到回答,我会在其他地方发布解决此问题的解决方案,以防将来帮助某人。 请参阅source

select *
from TableA as a
left join TableB as b
    on b.A_Id = a.A_Id
where
    b.A_Id is not null or
    not exists (select top 1 A_Id from TableB)

答案 2 :(得分:2)

这里是另一行,但是如果表B为空,则需要向表B添加一个“空”行

-- In case B is empty
Insert into TableB (col1,col2) values (null,null)

select * 
from TableA as a inner join TableB as b
on 
    b.A_Id = a.A_Id
    or b.A_Id is null

答案 3 :(得分:0)

试试这个

SELECT t1.* FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.something = t2.someotherthing UNION SELECT * FROM table1 WHERE something = somethingelse;

答案 4 :(得分:0)

这是解决方案:

CREATE TABLE MyData(Id INT, Something VARCHAR(10), OwnerId INT);
CREATE TABLE OwnerFilter(OwnerId INT);

SELECT * 
FROM 
(SELECT NULL AS Gr) AS Dummy
LEFT JOIN OwnerFilter F ON (1 = 1)
JOIN MyData D ON (F.OwnerId IS NULL OR D.OwnerId = F.OwnerId);

链接到sqlfiddle:http://sqlfiddle.com/#!6/0f9d9/7

答案 5 :(得分:0)

我将使用if-else块来解决它,如下所示:

if (select count(*) from tableB) > 0
begin
   Select * from TableA a Inner Join TableB b on a.ID = b.A_ID
end
else
begin
   Select * from TableA
end

答案 6 :(得分:0)

我做了以下事情:

DECLARE @TableB TABLE (id INT)
-- INSERT INTO @TableB
-- VALUES (some ids to filter by)

SELECT TOP 10 *
FROM [TableA]          A
     LEFT JOIN @TableB B
               ON A.ID = B.id
WHERE B.id IS NOT NULL
   OR iif(exists(SELECT *
                 FROM TableB), 1, 0) = 0

现在: 如果TableB为空(将注释行保留为注释),则将获得前10名。 如果TableB中有一些ID,则您只能通过这些ID加入。

我不知道这有多有效。欢迎发表评论。

答案 7 :(得分:0)

也许使用CTE

;WITH ctetable(
 Select * from TableA
)
    
IF(EXISTS(SELECT 1 FROM TableB))
BEGIN
 Select * from ctetable 
  Inner join TableB
END
ELSE 
BEGIN
 Select * from ctetable 
END

或动态SQL

DECLARE @Query NVARCHAR(max);
SET @QUERY = 'Select * FROM TableA';
IF(EXISTS(SELECT 1 FROM TableB))
BEGIN
 SET @QUERY = CONCAT(@QUERY,' INNER JOIN TableB');
END
EXEC sp_executesql @Query