2015-12-12 4 views
0

Я хотел бы узнать наиболее эффективный способ выполнения нижеследующего запроса. У меня есть 2 таблицы:SQL Efficiency Query

CREATE TABLE Table1 (
    Table1Id INT NOT NULL PRIMARY KEY 
); 
go 

CREATE TABLE Table2 (
    Table2Id INT NOT NULL PRIMARY KEY, 
    EndDate DATE NULL, 
    Table1Id INT NOT NULL 
); 
go 

Я хотел бы знать все Table1IDs, которые не в таблице 2, или если они находятся в таблице 2, они должны иметь EndDate до текущей даты.

Я знаю, что могу поступить правильно, но не уверен, как решить задачу EndDate. Любая помощь будет принята с благодарностью. Спасибо.

+0

Это добавило бы большую ценность вашему вопросу, если бы вы предоставили некоторые данные из трех таблиц и ожидаемый результат. –

+0

Таблица 1 Записи: 1; 2; 3; 4; 5; Таблица 2 Записи: 1,11012015,1; 2,12112015,2; 3 ,, 1; 4, 12312015, 4; Запрос должен возвращать следующие идентификаторы таблицы 1: 2, 3, 5. Надеюсь, это поможет. Спасибо. – user2511772

+0

Вы должны помнить, что самый эффективный TSQL-запрос будет неэффективным, если у вас не будет индекса, разбиения на разделы, сжатия и т. Д. Конечно, это зависит от размера таблицы, но не прощайте об этом. – sdrzymala

ответ

0

Следующие должны работать достаточно хорошо:

Select distinct Table1Id from Table1 left join Table2 using (Table1Id) 
where Table2Id is null or EndDate < now(); 

Может быть, вам нужно заменить using (Table1Id) на on (Table1.Table1Id = Table2.Table1Id) на MSSQL.

+0

sql server does not use now, возможно OP имеет неуместные теги – Mihai

0

Я бы посмотрел на него в двух частях. Во-первых, получить все записи из Table1, которые не в таблице 2. Это делается с левой присоединиться:

SELECT DISTINCT t1.* 
FROM dbo.Table1 t1 
    LEFT JOIN dbo.Table2 t2 
     ON t1.Table1Id = t2.Table1Id 
WHERE t2.Table2Id IS NULL 

В следующей части, вы хотите записи из Table1, что действительно есть матч в Table2, но EndDate до текущей даты. LEFT JOIN уже вернет записи из Table1, которые имеют соответствие в Table2, мы просто должны изменить предложение WHERE, чтобы проверить EndDate, если t2.Table2Id не имеет значения. Это дало бы окончательный запрос о:

SELECT DISTINCT t1.* 
FROM dbo.Table1 t1 
    LEFT JOIN dbo.Table2 t2 
     ON t1.Table1Id = t2.Table1Id 
WHERE t2.Table2Id IS NULL 
    OR t2.EndDate < CONVERT(date, GETDATE()); 
+0

Спасибо. Я не был уверен, нужно ли мне делать 2 звонка или я мог бы выполнить его в 1 запросе. Я думал об использовании профсоюза, но не был уверен в лучшей практике. – user2511772