如何从两个没有关系的SQL Server表中获取数据?

时间:2015-06-04 23:04:53

标签: sql-server database sql-server-2008-r2

我被要求从两个表格中提取数据,但是现在还不能解决这个问题,而且在这一点上它有点过头了,可以真正使用一些帮助。

两个表,不完全是父/子关系(至少在我有限的理解中),并且没有我看到的主键(没有设置数据库,所以如果你认为它会有助于添加免费这么说)。

表#1包含服务器名称,共享名称,共享路径,共享所有者和权限。服务器名称,共享名称,所有者和权限可以是重复的。服务器名称和路径的组合是每条记录的唯一性(应该是复合键吗?)。路径可以嵌套(D:\ Folder1 \是路径,以及D:\ Folder1 \ Folder2;例如见下文)


表#1 - 股票

Servername     ShareName     Path          Owner      Permissions
-----------------------------------------------------------------
Server01       Share01       D:\Folder1    jsmith     Everyone
Server01       Share02       D:\Folder2    jsmith     jsmith,ssmith
Server01       Share03       D:\Folder2\A  jdoe       jdoe,jsmith
Server02       Share01       E:\Folder1    ksmith     ksmith,jdoe
Server03       Share01       G:\Folder1    jsmith     Everyone
Server03       Share02       C:\Folder1    jsmith     Everyone



表#2是这些服务器上列出的文件的细分。此列表还可以包括表#1中未列出的文件路径。每个文件记录都是唯一的,但文件名/路径/扩展名/修改日期本身不是。

表#2 - FileInfo

Hostname     Filename     FolderPath    FileExtension LastModified
-----------------------------------------------------------------
Server01     FileA.txt    D:\Folder1    txt           1/1/1900
Server01     FileB.log    D:\Folder2    log           2/1/2000
Server01     FileC.ini    D:\Folder2\A  ini           3/1/2001
Server02     FileD.xls    E:\Folder1    xls           3/2/2010
Server03     FileE.exe    G:\Folder1    exe           3/2/2011
Server03     FileF.ppt    C:\Folder1    ppt           5/10/1998



从这两个我希望能够查询和获取两者的信息。例如,对于表#1中列出的每个路径,表#2中该路径的所有文件的最早LastModified日期是什么。

表#1中有大约160k行,表#2中有1.1亿行,所以我不确定是否强制采用任何特定方法?

2 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,你只需要使用每个表中的两列来进行简单的连接:

SELECT
  Shares.Servername,
  Shares.Path,
  MIN(FileInfo.LastModified)
FROM Shares
INNER JOIN FileInfo ON
  Shares.Servername = FileInfo.Hostname AND
  Shares.Path = FileInfo.FolderPath
GROUP BY
  Shares.Servername,
  Shares.Path

答案 1 :(得分:0)

你能用公共表格表达式做这样的事情:

;with t2 as (
select *,
row_number() over(partition by FolderPath order by LastModified asc) as RowNum
from Table2)
select t2.LastModified, t1.Path
from t2
inner join Table1 t1 on t2.FolderPath = t1.Path
where RowNum = 1