Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有更好的方法来编写tsql查询?_Sql_Sql Server_Tsql - Fatal编程技术网

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

有没有更好的方法来编写tsql查询?,sql,sql-server,tsql,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) 我所需要的是同一区域中所有大于截止日期的记录。如果同一区域中有任何记录的状态为1,也可以。和记录来自同一个表 上面的查询工

以下是查询:-

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)
我所需要的是同一区域中所有大于截止日期的记录。如果同一区域中有任何记录的状态为1,也可以。和记录来自同一个表


上面的查询工作正常。但是我希望有更好的方法来编写这种查询。

您可以这样重写它:

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
)

截止日期之后,或同一区域中状态为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
        )
如果这不是您想要的,请澄清您的问题。:)


这与你问题中的查询相同。除此之外,我真的不知道你的意思。

你所说的同一区域是什么意思

如果是这样,那你就太复杂了。我相信你可以试试

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

假设
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)
您可以将其进一步简化为:

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

如果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)

此查询运行不正常。我会显式地将日期文本转换为日期时间。如何检查“来自同一区域的任何记录的状态为1?”“?错了。优先级不是这样发生的。@Serge<代码>和的优先级高于
。这就是
where
子句的解释方式。以下是微软的描述。我想其他所有数据库都会有类似的描述。我也是,你可能知道。我早些回答,但是。。。(酸葡萄)