2015-06-04 4 views
0

Мне было предложено извлечь данные из двух таблиц, но я не могу понять это и немного по голове в этот момент и действительно может использовать некоторую помощь.Как получить данные из двух таблиц SQL Server без отношения?

Две таблицы, не совсем родственные/дочерние отношения (по крайней мере, в моем ограниченном понимании), и никаких первичных ключей, которые я вижу (не устанавливал БД, поэтому, если вы думаете, что это поможет добавить, сказать так).

Таблица № 1 имеет имя сервера, имя общего ресурса, путь к доле, владелец доли и разрешения. Имена серверов, имена общих ресурсов, владелец и разрешения могут быть дублирующими. Сочетание имени и пути сервера является уникальным для каждой записи (должен ли это быть составной ключ?). Контуры могут быть вложенными (D: \ Папка1 \ это путь, а также D: \ Папка1 \ 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, какая самая старая дата LastModified для всех файлов этого пути в таблице # 2.

В таблице №1 имеется ~ 160 тыс. Строк и 110 млн строк в таблице # 2, поэтому я не уверен, что это заставляет какой-либо конкретный подход?

+0

SQL «первичный ключ» является просто синонимом «unique not null» (и означает «superkey») в отношении ограничения. Любая комбинация столбцов, содержащих уникальную комбинацию, также уникальна. Поскольку путь уникален, он является ключом кандидата сам по себе. (Предполагая, что нет лишних суперклеев.) Хотя вы говорите (имя файла, FolderPath, FileExtension, LastModified) не уникально, но каждая строка является недостаточной для определения ключей кандидата FileInfo (неприводимых суперклеев). – philipxy

ответ

0

Не могли бы вы сделать что-то подобное с поваренной expresion:

;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 
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 
+0

Пробовал это и не получил никаких возвратов. Пробовал прокомментировать выбор мин и все еще не вернулся? – jclifford90

+0

Извините за поздний ответ; Меня не было. Я помещал ваши таблицы и мой запрос в SQLFiddle, и запрос возвращал ожидаемые результаты для таблиц и данных в вашем вопросе. Посмотрите [здесь] (http://sqlfiddle.com/#!3/a7261/1) и посмотрите, есть ли какие-либо существенные различия между вашими структурами таблиц и теми, что есть в скрипке. Я использовал 'VARCHAR (30)' для всех столбцов символов и 'DATE' для даты, но если все ваши столбцы символов являются« VARCHAR »какого-то типа, и независимо от типа даты он все равно должен работать. Дай мне знать... –

Смежные вопросы