有没有更好的方法来编写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
子句的解释方式。以下是微软的描述。我想其他所有数据库都会有类似的描述。我也是,你可能知道。我早些回答,但是。。。(酸葡萄)