Sql:根据另一个表选择行(如果已填充或为空)

hub*_*ber 2 sql-server

我有两张桌子。第一个称为 TempIds,它只包含一个名为 Id 的列,其类型为 int

临时 ID:

Id
45
34
77
Run Code Online (Sandbox Code Playgroud)

第二个称为“国家”,它有两列:“ID”和“国家名称”:

Id      Name
22      Austria
45      Germany
88      China
12      Japan
Run Code Online (Sandbox Code Playgroud)

我想要的是从国家表中选择与 TempIds 表中的 Id 匹配的所有行。但问题是,如果 TempIds 为空,则查询应返回“国家/地区”中的所有行。

到目前为止,这是我尝试过的:

select *
from Countries c
left join TempIds t on c.Id = t.Id or t.Id is null


select *
from Countries c
left join TempIds t on c.Id = t.Id
where (c.Id = t.Id or t.Id is null)
Run Code Online (Sandbox Code Playgroud)

上面的两个查询都没有返回正确的记录。我的问题是,如何编写一个返回正确结果的查询。也就是说,根据当前的 TempIds 表,我应该只获得德国。但如果 TempIds 为空,那么我应该从“国家”表中获取所有国家/地区。

感谢是提前的

小智 5

非常基本,但可以尝试:->

SELECT c.* 
FROM 
   countries c LEFT OUTER JOIN tempids t 
      ON c.id = t.id
WHERE
   t.id is not null 
   OR NOT EXISTS (SELECT 1 FROM tempids)
Run Code Online (Sandbox Code Playgroud)

另一种选择:->

WITH CTE as 
(
   SELECT 
     c.id, c.name, t.id as t_id 
   FROM
      countries c LEFT OUTER JOIN tempids t 
         on c.id = t.id
)
SELECT * 
FROM CTE
WHERE
   t.id is not null
   OR NOT EXIST (
      SELECT 1 
      FROM cte 
      WHERE t_id is not null 
   )
Run Code Online (Sandbox Code Playgroud)

或者非常简单的是首先检查 tempid 的表计数,然后决定查询:->

IF exists(select 1 from tempid)
BEGIN
  SELECT c.* 
  FROM 
     countries c INNER JOIN tempids t 
       ON c.id = t.id
END
ELSE
BEGIN
   SELECT * from countries
END
Run Code Online (Sandbox Code Playgroud)

请不要介意格式。