我在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;
屏幕截图:
所有表格的记录: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'ج%');
你知道为什么吗? 谢谢
答案 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上找到一个测试