为什么SQL Server的AND条件不起作用?

时间:2018-10-07 09:28:10

标签: sql-server stored-procedures

我在SQL Server中有一个简单但奇怪的问题;这些代码行可以正常工作:

SELECT MAX(BPInfoID) 
FROM BasicPersonalInfo 
WHERE LastName LIKE N'ج%';

SELECT LEFT(Client.DocNum, 5) 
FROM Client 
WHERE Client.BPInfoID = (SELECT MAX(BPInfoID) 
                         FROM BasicPersonalInfo 
                         WHERE LastName LIKE N'ج%');

SELECT LEFT(Client.DocNum, 5) 
FROM Client 
WHERE Client.DocNumMood = 0;

屏幕截图:

enter image description here enter image description here

https://imgur.com/lf6CXIs

所有表格的记录:https://imgur.com/u9sZIZt

BPInfoID-DocNumMood-DocNum
35-False-00001 /ج/ 97
36-False-00002 /ج/ 97
37-正确-00003 /ج/ 97
38-False-00001 /ط/ 97

但是当我将它们组合在一起时,此查询将不起作用并且什么也不显示

SELECT 
    LEFT(Client.DocNum, 5) 
FROM 
    Client 
WHERE 
    Client.DocNumMood = 0 
    AND Client.BPInfoID = (SELECT MAX(BPInfoID) 
                           FROM BasicPersonalInfo 
                           WHERE LastName LIKE N'ج%');

你知道为什么吗? 谢谢

1 个答案:

答案 0 :(得分:3)

可能仅仅是因为具有BPInfoID的MAX(BPInfoID)的记录没有DocNumMood = 0

您可以验证单独的查询是否返回了两者中的记录。

如果要返回的是那些单独查询中的任何一个?然后可以将WHERE中的AND替换为OR。

但是基于注释,您实际上想要获取具有最大BPInfoID的Client记录,但仅适用于DocNumMood为false的情况。

因为BPInfoID可能是BasicPersonalInfo中的主键。
然后,客户可以简单地在该BPInfoID上加入BasicPersonalInfo。

然后将TOP 1与ORDER BY结合使用,您可以获得预期的结果。

SELECT TOP 1 LEFT(cl.DocNum, 5) As DocNumPart
FROM Client AS cl
JOIN BasicPersonalInfo info 
  ON (info.BPInfoID = cl.BPInfoID AND 
      info.LastName LIKE N'ج%')
WHERE cl.DocNumMood = 0
ORDER BY cl.BPInfoID DESC;

您将在SQL Fiddle here上找到一个测试