【问题标题】:How to get data from two SQL Server tables with no relationship?如何从两个没有关系的 SQL Server 表中获取数据?
【发布时间】:2015-06-04 23:04:53
【问题描述】:

有人要求我从两个表中提取数据,但无法完全弄清楚,此时我有点不知所措,真的需要一些帮助。

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

表 #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 - 文件信息

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 亿行,所以我不确定这是否会强制采用任何特定方法?

【问题讨论】:

  • 就约束而言,SQL“主键”只是“唯一非空”的同义词(意味着超级键)。包含唯一组合的列的任何组合也是唯一的。由于 Path 是唯一的,它本身就是一个候选键。 (假设没有空的超级键。)虽然您说 (Filename, FolderPath, FileExtension, LastModified) 不是唯一的,但每一行都是唯一的,但这不足以确定 FileInfo 的候选键(不可约的超级键)。

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


【解决方案1】:

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

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

【讨论】:

  • 试过了,没有任何回报。尝试注释掉最小选择但仍然没有返回?
  • 抱歉回复晚了;我已经离开了。我将您的表和查询放入 SQLFiddle 中,查询返回了您问题中表和数据的预期结果。看看here,看看您的表结构与小提琴中的表结构是否有任何显着差异。我对所有字符列使用VARCHAR(30),对日期使用DATE,但是如果您的所有字符列都是某种VARCHAR,那么无论是什么日期类型,它都应该仍然有效。让我知道...
【解决方案2】:

你能用一个通用的表表达式做这样的事情吗:

;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

【讨论】:

    猜你喜欢
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多