当UNION ALL不存在记录时如何选择null?

时间:2018-02-24 15:31:01

标签: sql sql-server database select null

我有一本excel的书,里面有数百名学生的记录,每本学生都有一个识别号码,后跟名字和姓氏。

我需要提取更多信息,例如出生日期,性别等。为此,我有一个学生表,其中存储了我需要的所有信息(因此我不需要任何加入与其他表),所以我想在excel中做rune函数,连接查询后跟一个UNION:

=CONCATENAR("SELECT * FROM (SELECT TOP 1 Std_Identification, Std_Gender, Std_BirthDate FROM Student WHERE Std_Identification='";A1;"') AS T UNION ALL")

然而,识别号可能已经过时,因此记录不完整(如果我用200条记录进行查询,他们可以离开190),它们是小的差异,但我需要做几次这个任务,我想要的是这样:

+--------------------+------------+---------------+
| Std_Identification | Std_Gender | Std_BirthDate |
+--------------------+------------+---------------+
|      34998545      |      0     |   12/05/1997  |
+--------------------+------------+---------------+
|      12443334      |     NULL   |      NULL     |  <- This record NOT exists in the table Student
+--------------------+------------+---------------+
|      39405443      |      1     |   21/09/1980  |
+--------------------+------------+---------------+

我尝试使用以下查询,但我仍然没有成功:

SELECT * FROM (SELECT TOP 1 Std_Identification, Std_Gender, Std_BirthDate FROM Student WHERE Std_Identification='34998545') AS T UNION ALL
SELECT * FROM (SELECT TOP 1 Std_Identification, Std_Gender, Std_BirthDate FROM Student WHERE Std_Identification='12443334') AS T UNION ALL
SELECT * FROM (SELECT TOP 1 Std_Identification, Std_Gender, Std_BirthDate FROM Student WHERE Std_Identification='39405443') AS T

但结果是:

+--------------------+------------+---------------+
| Std_Identification | Std_Gender | Std_BirthDate |
+--------------------+------------+---------------+
|      34998545      |      0     |   12/05/1997  |
+--------------------+------------+---------------+
|      39405443      |      1     |   21/09/1980  |
+--------------------+------------+---------------+
  • 如何使SELECT UNION显示为NULL而不是空白 什么时候记录不存在?
  • 是否可以这样做但是当我需要连接几个时 表?让我们说我需要提取那些主题的数量 在另一个表 X 中(因此在...之间建立一个JOIN) 表学生和表 X ),但并非所有学生都有代码或 记录以将其与该表 X
  • 相关联

3 个答案:

答案 0 :(得分:0)

只需将您需要的值分配给相关列

SELECT * FROM (SELECT TOP 1 Std_Identification, Std_Gender, Std_BirthDate 
        FROM Student WHERE Std_Identification='34998545') AS T UNION ALL
SELECT  '12443334', NULL, NULL  UNION ALL
SELECT * FROM (SELECT TOP 1 Std_Identification, Std_Gender, Std_BirthDate 
        FROM Student WHERE Std_Identification='39405443') AS T

或者你可以在相同的桌子上使用左连接,在条件下应用teh过滤器...这样,如果你有200名学生,你可以检索200行,包括不匹配过滤器的行

select distinct a.Std_Identification 
from Student a
left join stundent b on a.Std_Identification = b.Std_Identification 
        AND b.Std_Gender = 'M'

答案 1 :(得分:0)

很久以前我有这个问题,问题是我需要一个SQL Server数据库数据,但是从一个学生的身份来看,Excel中数据的顺序非常重要,因为我需要粘贴新的电子表格上的数据。

一些数据不存在(因为该标识不在数据库中),因此我无法忽略它,为此,我使用的是SELECT UNION,这最终导致它返回的行数更少。

我当时发现的最简单的解决方案是在电子表格(Excel)中为每行创建一个公式,以将行插入到临时表中:

=CONCATENAR("INSERT INTO @TempTable(Id) VALUES('";A1;"');")

然后进行外部申请,类似于将LEFT JOIN与TOP 1组合在一起,这使我可以拥有最新的记录,因为在表中可以有多个具有相同标识的记录:

DECLARE @TempTable TABLE ( Id VARCHAR(20) NULL );

// paste your inserts into from Excel

SELECT T.Id, SS.Std_Identification, SS.Std_Gender, SS.Std_BirthDate 
FROM @TempTable T
OUTER APPLY
( 
    SELECT TOP 1 S.Std_Identification, S.Std_Gender, S.Std_BirthDate 
    FROM Student S 
    WHERE S.Std_Identification = T.Id
    ORDER BY S.CreationDate DESC 
) AS SS

答案 2 :(得分:0)

如果我理解正确,

1)在数据库上创建一个临时表,其中有一列Studentid。

2)将INSERT INTO写入临时表值(“ A1”),然后将INSERT公式复制到所有行。通过这种方式,您可以创建具有所有ID的INSERT INTO脚本。

3)左键将您的临时表连接到学生表,所有不在学生表中的记录将显示为NULL。Row_Number()可用于根据条件过滤出重复项。

编辑1:

我无法回复您的评论,所以我在这里进行编辑。

APPLY也可以使用。 如果要使用LEFT JOIN,则可以使用Row_number()根据日期过滤出重复对象

SELECT T.Id, SS.Std_Identification, SS.Std_Gender, SS.Std_BirthDate
FROM
@TempTable T
LEFT JOIN 
  (SELECT 
   S.Std_Identification, S.Std_Gender, S.Std_BirthDate,ROW_NUMBER() OVER       
   (PARTITION BY S.Std_Identification ORDER BY S.CreationDate DESC ) AS RN
  )S
 ON
 T.Id=S S.Std_Identification
 WHERE S.RN=1