2013-05-24 4 views
1

Вот вопрос: -Есть ли лучший способ написать запрос tsql?

SELECT * FROM table 
WHERE CutOffDate > '2013-05-23 00:00:00.001' 
    AND Zone = 1 
    OR id IN (SELECT id FROM table 
      WHERE Zone = 1 
       and status = 1) 

Все мне нужно, все записи больше, чем cutoffdate в той же зоне. Также, если какая-либо запись от в той же зоне имеет статус 1. И записи взяты из одной таблицы.

Вышеуказанный запрос работает нормально. Но я надеюсь, что определенно лучший способ написать такой запрос.

+1

Этот запрос не работает нормально. – Serge

+0

http://www.w3schools.com/sql/sql_join_left.asp –

+0

Я бы явно «CAST» литерал даты в DateTime. – RBarryYoung

ответ

1

Логически, ваш запрос эквивалентен:

SELECT * FROM table 
WHERE Zone = 1 
AND (CutOffDate > '2013-05-23 00:00:00.001' OR status = 1) 
0

Вы можете переписать это так:

SELECT 
    * 
FROM table 
WHERE CutOffDate > '2013-05-23 00:00:00.001' 
AND (
    Zone = 1 
    OR 
    Status = 1 
) 

Но я предполагаю, что ваш оригинальный ISN запрос "т действительно делает то, что вы ожидаете, что делать ...

EDIT: Только в случае, если вы на самом деле цифра ваш запрос не делает работу, это один может:

SELECT 
    * 
FROM table AS T1 
WHERE T1.CutOffDate > '2013-05-23 00:00:00.001' 
AND EXISTS (
    SELECT TOP(1) 
     1 
    FROM table AS T2 
    WHERE T2.Zone = T1.Zone 
    AND T2.Status = 1 
) 
+1

Как эта проверка для «любой записи из той же зоны имеет статус 1»? – Andomar

0

После даты прекращения или строки со статусом 1 в той же зоне:

SELECT * 
FROM YourTable yt1 
WHERE CutOffDate > '2013-05-23 00:00:00.001' 
     OR EXISTS 
     (
     SELECT * 
     FROM YourTable yt2 
     WHERE yt1.Zone = yt2.Zone 
       AND yt2.status = 1 
     ) 

Если это не то, что вы ищете, уточните свой вопрос. :)

0
SELECT * FROM [table] 
    WHERE Zone = 1 
     AND 
      (CutOffDate > '2013-05-23 00:00:00.001' 
      OR status = 1) 

Это то же самое, что и запрос в вашем вопросе. Я не могу сказать, что вы имеете в виду, кроме этого.

2

Что вы подразумеваете под Same Zone? То же, что и что ?? Как написано в запросе, вы говорите, что вы имеете в виду Зона 1.

Если это так, значит, вы усложнили его. Я полагаю, вы могли бы попробовать

SELECT * FROM table 
WHERE Zone = 1 
    And (status = 1 Or CutOffDate 
     > '2013-05-23 00:00:00.001') 
+0

Я думаю, что это то, что он ищет ... – Kaf

+0

Так и я, вы, наверное, можете сказать. Я отвечаю раньше, но ... (кислый виноград) – Jodrell

0

Предполагая id является уникальным в исходной таблице, то ваша логика эквивалентна:

SELECT * 
FROM table 
WHERE (CutOffDate > '2013-05-23 00:00:00.001' AND Zone = 1) 
     or (zone = 1 and status = 1); 

Вы можете еще больше упростить это:

SELECT * 
FROM table 
WHERE zone = 1 and 
     (CutOffDate > '2013-05-23 00:00:00.001' or status = 1); 

Если id не уникален, тогда ваш запрос - хороший способ сделать то, что вам нужно. В качестве альтернативы вы могли бы рассказать запрос, используя функции окна.

+0

Неверный. Это не так, как имеет место приоритет. – Serge

+1

@Serge. , , 'AND' имеет более высокий приоритет, чем' OR'. Вот как интерпретируется предложение 'where'. Вот описание Microsoft, http://msdn.microsoft.com/en-us/library/ms186992(v=sql.105).aspx.Я думаю, что каждая другая база данных будет иметь аналогичное описание. –

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