我有一本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 |
+--------------------+------------+---------------+
答案 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