有没有更好的方法来编写SQL查询?

时间:2013-05-24 13:16:44

标签: sql sql-server 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.并且记录来自同一个表。

以上查询工作正常。但我希望有一种更好的方式来编写这种查询。

6 个答案:

答案 0 :(得分:2)

同一区域 是什么意思?什么??查询的编写方式似乎是指第1区。

如果是这样,那么你已经过度复杂了。我相信你可以试试

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

答案 1 :(得分:1)

逻辑上,您的查询等同于:

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

答案 2 :(得分:0)

你可以像这样重写它:

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

但我猜你的原始查询并没有真正做到你期望它做的事情......

编辑:如果您确实认为您的查询没有完成这项工作,可能会:

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
)

答案 3 :(得分: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
        )

如果那不是您要找的,请澄清您的问题。 :)

答案 4 :(得分:0)

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

这与您问题中的查询相同。除了那个,我真的不能说出你的意思。

答案 5 :(得分: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不是唯一的,那么您的查询是一种很好的方式来满足您的需求。或者,您可以使用窗口函数来表达查询。

相关问题