我有 2 个表说 A 和 B,我想加入它们。
表 A 中将始终包含记录。
当表 B 中有行时,我希望查询转换表 A 和表 B 匹配的所有行。(即表现得像内连接)
但是,如果表 B 为空,我想返回表 A 中的所有内容。
这可以在 1 个查询中完成吗?
谢谢。
我有 2 个表说 A 和 B,我想加入它们。
表 A 中将始终包含记录。
当表 B 中有行时,我希望查询转换表 A 和表 B 匹配的所有行。(即表现得像内连接)
但是,如果表 B 为空,我想返回表 A 中的所有内容。
这可以在 1 个查询中完成吗?
谢谢。
是的,对于这样的结果,使用LEFT JOIN
.
基本上INNER JOIN
它只返回在另一张表上至少有一个匹配的行。LEFT JOIN
另一方面,返回左侧表上的所有记录,无论它在另一张表上是否不匹配。
要进一步了解有关联接的更多信息,请访问以下链接:
我遇到了同样的问题,并且由于从未得到解答,因此我在其他地方发布了针对此问题的解决方案,以防将来对某人有所帮助。查看源代码。
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)
这是另一个,但如果表 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
我会使用 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
这是解决方案:
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
尝试这个
SELECT t1.* FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.something = t2.someotherthing UNION SELECT * FROM table1 WHERE something = somethingelse;
我做了以下事情:
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,您将只加入这些。
我不知道这有多有效。欢迎评论。
也许使用 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