以下是查询: -
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.并且记录来自同一个表。
以上查询工作正常。但我希望有一种更好的方式来编写这种查询。
答案 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不是唯一的,那么您的查询是一种很好的方式来满足您的需求。或者,您可以使用窗口函数来表达查询。