这些SQL查询是否相同?

时间:2014-08-29 06:44:33

标签: sql sql-server tsql

我对SQL很新。第一个查询是“正确的”,但我想重写它,以便它不返回任何内容而不是“确定”。查询#2是我的尝试。据我所知,这是正确的,因为JOIN条件将两个日期不同的所有行分开。但是我不确定这个,因为我说我对此很新。问题是我没有测试数据可以交叉验证。你能帮忙吗?

1

DECLARE @date1 datetime, 
                     @date2 datetime
SELECT  @date1 = Max(date) FROM table1
WHERE 1 = 1
        AND id = 1
        AND id2 = 11

SELECT  @date2 = Max(date) FROM table2
WHERE 1 = 1
        AND id = 2
        AND id2 = 11

SELECT 
        CASE 
                     WHEN COALESCE(@date1,0) = @date2 
                                 THEN 'Ok'
                     WHEN  CONVERT(TIME,GETDATE()) < '19:00:00' 
                                 THEN  'Ok'
                                 ELSE  'Not Ok'
        END AS Warning

2:

DECLARE  @date1 datetime
    ,@date2 datetime
    ,@id int = 1

SELECT  @date1 = COALESCE(MAX(date),0) FROM table1
WHERE 1 = 1
AND id = @id
AND id3 = 11
SELECT  @date2= MAX(date) FROM table1
WHERE 1 = 1
AND id = @id
AND id2 = 11


SELECT 
    'Warning' = CASE WHEN  CONVERT(TIME,GETDATE()) > '19:00:00' 
                     THEN  'not ok'
                END
FROM dbo.table1 AS a
INNER JOIN dbo.table AS a2 ON 1 = 1
AND @date1 != @date2
WHERE 1 = 1
AND a.nBranchId = @id
AND a.nInstrId = 11

1 个答案:

答案 0 :(得分:1)

不太相同。在这两个版本中,如果没有满足用于初始化其值的查询条件的行,则@date1变量将为NULL。

如果是这种情况,那么从版本1开始的最后一次选择将返回一行,其值为&#34; Ok&#34;或者&#34; XP_ResultsOutRightForwards&#34;中缺少前向点,具体取决于当前时间。

然而,版本2不会返回任何行,因为您在inner join的条件下使用了此变量。不等式不适用于NULL值,因此您将收到一个空集。