2013-12-03 3 views
0

У меня есть запрос, который извлекает информацию из таблиц sys, чтобы создать список новых объектов, которые были созданы в нашей среде. Что мне нужно сделать, так это последняя часть запроса должна быть в состоянии смотреть на другую таблицу и вытаскивать 3 самые последние записи и использовать дату из этих записей, чтобы показать только те объекты, которые были созданы с тех трех дат. В моем тестировании я продолжаю работать в «Subquery возвратил более 1 значения». Любая помощь будет принята с благодарностью.Попытка вытащить новые объекты SQL между датами из другой таблицы

EDIT: Я в настоящее время работаю SQL 2008 R2.
Запрос выполняется теперь как есть, но только тянет самую последнюю дату, мне нужно, чтобы он вытащил все из последних 3 дат.

SELECT 
    a.name AS ObjectName, b.name AS ParameterName, c.name AS DataType, 
    b.isnullable AS [Allow Nulls?], a.crdate AS CreateDate, 
    CASE WHEN d .name IS NULL THEN 0 ELSE 1 END AS [PKey?], 
    CASE WHEN e.parent_object_id IS NULL THEN 0 ELSE 1 END AS [FKey?], 
    CASE WHEN e.parent_object_id IS NULL THEN '-' ELSE g.name END AS [Ref Table], 
    CASE WHEN h.value IS NULL THEN '-' ELSE h.value END AS Description, 
    c.length AS FieldSize, a.replinfo AS IsReplicated, 
    CASE a.xtype WHEN 'V' THEN 'View' WHEN 'P' THEN 'StoredProcedure' WHEN 'FN' THEN 'ScalarFunction' WHEN 'F' THEN 'ForeignKey' WHEN 'U' THEN 'Table' WHEN 
         'TR' THEN 'Trigger' WHEN 'TT' THEN 'TableType' WHEN 'PK' THEN 'PrimaryKey' END AS ObjectType 
FROM 
    sys.sysobjects AS a 
    INNER JOIN sys.syscolumns AS b ON a.id = b.id 
    INNER JOIN sys.systypes AS c ON b.xtype = c.xtype 
    LEFT OUTER JOIN 
     (SELECT so.id, sc.colid, sc.name 
     FROM 
      sys.syscolumns AS sc 
      INNER JOIN sys.sysobjects AS so ON so.id = sc.id 
      INNER JOIN sys.sysindexkeys AS si ON so.id = si.id AND sc.colid = si.colid 
     WHERE (si.indid = 1)) AS d ON a.id = d.id AND b.colid = d.colid 
    LEFT OUTER JOIN sys.foreign_key_columns AS e ON a.id = e.parent_object_id AND b.colid = e.parent_column_id 
    LEFT OUTER JOIN sys.objects AS g ON e.referenced_object_id = g.object_id 
    LEFT OUTER JOIN sys.extended_properties AS h ON a.id = h.major_id AND b.colid = h.minor_id 
WHERE  (a.type = 'U' OR 
        a.type = 'V' OR 
        a.type = 'F' OR 
        a.type = 'PK' OR 
        a.type = 'P' OR 
        a.type = 'FN' OR 
        a.type = 'TT' OR 
        a.type = 'TR') AND 
        (a.crdate > 
         (SELECT  TOP (1) DeployDate 
          FROM   OtherTable.dbo.Tracking 
          ORDER BY DeployDate DESC)) 
ORDER BY CreateDate DESC 
+0

Он отлично работает для меня ... – Szymon

+0

Какой версии SQL Server вы работаете? –

+1

Запрос в виде написанных прогонов. [sqlfiddle] (http://www.sqlfiddle.com/#!6/77e0e/1/0). Когда возникает проблема? – conan

ответ

2

Если я правильно понимаю ваш вопрос, вы хотите, чтобы минимум три последних даты в таблице отслеживания.

Если да, то вы могли бы сделать что-то вроде этого ...

(a.crdate > 
     (SELECT  Min(topthree.DeployDate) 
     FROM   (select Top 3 DeployDate 
        From dbo.Tracking 
        ORDER BY DeployDate DESC 
        ) as topthree 
     ) 
) 
Смежные вопросы