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

问题描述 投票:1回答:3

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

TempIds:

Id
45
34
77

第二个叫做国家,有两列,Id和Name国家:

Id      Name
22      Austria
45      Germany
88      China
12      Japan

我想要的是从States表中选择与TempIds表中的Ids匹配的所有行。但问题是,如果TempIds为空,则查询应返回来自Countries的所有行。

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

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)

上述两个查询都不会返回正确的记录。我的问题是,如何编写一个返回正确结果的查询。也就是说,根据目前的TempIds表,我应该只得到德国。但是如果TempIds是空的,那么我应该从Countries表中获取所有国家。

谢谢你的提前

sql-server
3个回答
2
投票

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

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)

另一种选择: - >

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 
   )

或者很简单,首先检查一下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

请不要介意格式化。


0
投票

从Country表中选择与TempIds表中的Ids匹配的所有行。但问题是,如果TempIds为空,则查询应返回来自Countries的所有行。

听起来你应该写一个IF条件来检查场景,并根据它运行适当的查询。

就像是,

IF EXISTS (SELECT 1 FROM TempIds t INNER JOIN Countries c ON c.ID = t.ID)
BEGIN
    -- TempIDs has at least one record that maps to countries.
    SELECT c.*
    FROM TempIds t 
    INNER JOIN Countries c 
    ON c.ID = t.ID
END
ELSE
BEGIN
    SELECT *
    FROM Countries
END

0
投票

如果TempIds具有空值,则使用UNION运算符和CROSS JOIN来获取所有国家/地区

SELECT c.id, c.name FROM Countries c
LEFT JOIN TempIds t on c.id = t.id
UNION
SELECT t.id, c.name FROM TempIds t, Countries c
WHERE t.id IS NULL

© www.soinside.com 2019 - 2024. All rights reserved.