2012-03-02 89 views
0

我需要从表A返回行的查询,如果在表中的值X是不一样的Y值的总和从表B中对应的行(S)的问题是,有可能会或可能不是表B中对应于表A中的行的行,但如果表B中没有行,那么表A中的行仍应返回(因为表B中没有匹配的值)。就像一个LEFT OUTER连接场景,但是作为附加选择条件的比较是非常复杂的。SQL Server的SELECT语句

我有一个查询,则正好相反,即。如果表A中的值与表B中的行值相同,则返回行,但遗憾的是,这不是我所需要的!

SELECT TableA.id, TableA.bdate 
FROM TableA 
LEFT JOIN TableB ON TableB.ID = TableA.id 
WHERE TableA.select_field = 408214 
AND TableA.planned_volume = 
(select sum(actual_volume) 
from 
TableB 
where TableB.id = TableA.id) 
ORDER BY TableA.id 

任何帮助非常感谢。

+0

你的样品查询只从项目属性表A,所以我想表B只使用存在量化之中。正确? – onedaywhen 2012-03-02 15:27:01

+0

“但是如果有表B中没有任何行” - 你的意思一)表B是空集(字面解释),b)使用普通'id'属性没有匹配行,c)使用匹配'id'找不到匹配的行和'Y'的总和表达,d)别的东西? – onedaywhen 2012-03-02 15:28:35

+0

回答你的第一个问题......这是正确的 - 要返回刚刚从TableA的领域,但资格TableB中是不等于planned_value场TableA上 – epx 2012-03-02 15:30:30

回答

0
WITH TotalVolumes 
    AS 
    (
     SELECT id, SUM(actual_volume) AS total_volume 
     FROM TableB 
     GROUP 
      BY id 
    ) 
SELECT id, bdate, planned_volume 
    FROM TableA 
EXCEPT 
SELECT A.id, A.bdate, T.total_volume 
    FROM TableA AS A 
     JOIN TotalVolumes AS T 
      ON A.id = T.id; 
+0

onedaywhen,你已经破解了,但现在我需要添加一些制作的第一行返回,如: - 选择-1作为BATCH_ID, '{决定}' AS Batch_Date UNION和SELECT ... UNION不似乎去用:-( – epx 2012-03-02 15:54:19

+0

好的,知道了,THX onedaywhen – epx 2012-03-02 16:02:10

0
SELECT TableA.id, TableA.bdate 
FROM TableA 
LEFT JOIN TableB ON TableB.ID = TableA.id 
AND TableA.planned_volume <> 
(select sum(actual_volume) 
from 
TableB 
where TableB.id = TableA.id) 
ORDER BY TableA.id 
+0

一个“planned_volume”不存在,不工作,因为如果在表A,但没有在表b行,然后不返回任何结果 – epx 2012-03-02 14:47:31

+0

稍微改变它,再试一次。 – 2012-03-02 14:48:17

+0

对不起,太微妙了我,但我已经使用<>试过了,但它不返回我需要什么 – epx 2012-03-02 14:51:33

1

怎么是这样的:

SELECT TableA.Id, TableA.bdate 
FROM TableA 
    LEFT JOIN 
    (
     SELECT Id, SUM(actual_volume) AS b_volume 
     FROM TableB 
     GROUP BY Id 
    ) AS TableBGrouping 
     ON TableBGrouping.Id= TableA.Id AND TableA.planned_volume <> b_volume 
ORDER BY TableA.Id