这两个查询的区别(EXISTS with NOT LIKE 和 NOT EXISTS with LIKE)
The difference in these two queries (EXISTS with NOT LIKE and NOT EXISTS with LIKE)
我很难理解这两个查询之间的区别。不给出相同的输出,只是结果略有不同。这两个查询不是一样的,只是颠倒了吗?你可以看到最后一个子查询的不同。
SELECT *
FROM[dbo].[MNO International AB$Item] t1
WHERE
t1.[Item Type] = 0
AND (
NOT EXISTS(SELECT * FROM [dbo].[MNO International AB$Item Cross Reference] t2 WHERE t2.[Item No_] = t1.No_ AND t2.[Cross-Reference Type No_] = 'EAN13' AND t2.[Cross-Reference No_] <> '' AND t2.[Cross-Reference Type] = 3)
OR t1.[Statistics Group] = 0
) --Result: 2178
AND NOT EXISTS
(SELECT * FROM [dbo].[MNO International AB$Master] t2
WHERE t1.[Master No_] = t2.No_
AND t2.[Collection No_] LIKE 'NEW-NOS'
)
其他查询
SELECT *
FROM[dbo].[MNO International AB$Item] t1
WHERE
t1.[Item Type] = 0
AND (
NOT EXISTS(SELECT * FROM [dbo].[MNO International AB$Item Cross Reference] t2 WHERE t2.[Item No_] = t1.No_ AND t2.[Cross-Reference Type No_] = 'EAN13' AND t2.[Cross-Reference No_] <> '' AND t2.[Cross-Reference Type] = 3)
OR t1.[Statistics Group] = 0
) --Result: 2178
AND EXISTS
(SELECT * FROM [dbo].[MNO International AB$Master] t2
WHERE t1.[Master No_] = t2.No_
AND t2.[Collection No_] NOT LIKE 'NEW-NOS'
)
我认为结果会不一样。因为:
NOT(A = B AND C <> D)
= NOT(A = B) OR NOT(C <> D)
= A <> B OR C = D
Return 您的查询:
NOT EXISTS (t1.[Master No_] = t2.No_ AND t2.[Collection No_] NOT LIKE 'NEW-NOS')
= EXISTS (t1.[Master No_] <> t2.No_ OR t2.[Collection No_] LIKE 'NEW-NOS')
我很难理解这两个查询之间的区别。不给出相同的输出,只是结果略有不同。这两个查询不是一样的,只是颠倒了吗?你可以看到最后一个子查询的不同。
SELECT *
FROM[dbo].[MNO International AB$Item] t1
WHERE
t1.[Item Type] = 0
AND (
NOT EXISTS(SELECT * FROM [dbo].[MNO International AB$Item Cross Reference] t2 WHERE t2.[Item No_] = t1.No_ AND t2.[Cross-Reference Type No_] = 'EAN13' AND t2.[Cross-Reference No_] <> '' AND t2.[Cross-Reference Type] = 3)
OR t1.[Statistics Group] = 0
) --Result: 2178
AND NOT EXISTS
(SELECT * FROM [dbo].[MNO International AB$Master] t2
WHERE t1.[Master No_] = t2.No_
AND t2.[Collection No_] LIKE 'NEW-NOS'
)
其他查询
SELECT *
FROM[dbo].[MNO International AB$Item] t1
WHERE
t1.[Item Type] = 0
AND (
NOT EXISTS(SELECT * FROM [dbo].[MNO International AB$Item Cross Reference] t2 WHERE t2.[Item No_] = t1.No_ AND t2.[Cross-Reference Type No_] = 'EAN13' AND t2.[Cross-Reference No_] <> '' AND t2.[Cross-Reference Type] = 3)
OR t1.[Statistics Group] = 0
) --Result: 2178
AND EXISTS
(SELECT * FROM [dbo].[MNO International AB$Master] t2
WHERE t1.[Master No_] = t2.No_
AND t2.[Collection No_] NOT LIKE 'NEW-NOS'
)
我认为结果会不一样。因为:
NOT(A = B AND C <> D)
= NOT(A = B) OR NOT(C <> D)
= A <> B OR C = D
Return 您的查询:
NOT EXISTS (t1.[Master No_] = t2.No_ AND t2.[Collection No_] NOT LIKE 'NEW-NOS')
= EXISTS (t1.[Master No_] <> t2.No_ OR t2.[Collection No_] LIKE 'NEW-NOS')