2017-07-27 64 views
0

我需要一些sql查询帮助。如何选择1个表中不存在的数据?

我有1个表是dbo.invoice。

| PO_NO  | TYPE   | MOVEMENT_TYPE  | QUANTITY | SALESREF | FLOW | 
|---------- |----------- |--------------- |---------- |---------- |------ | 
| 10001001 | G.RECEIPT  | 101    | 1000.00 | 5001  | S  | 
| 10001001 | G.RECEIPT  | 101    | 2000.00 | 5002  | S  | 
| 10001001 | G.RECEIPT  | 122    | 1000.00 | 5001  | H  | 
| 10001001 | G.RECEIPT  | 122    | 1500.00 | 5002  | H  | 
| 10001001 | INVOICE  |     | 1000.00 | 5001  | S  | 
| 10001001 | INVOICE  |     | 2000.00 | 5002  | S  | 
| 10001001 | INVOICE  |     | 1500.00 | 5002  | H  | 

我需要的输出显示类型= G.RECEIPT没有对TYPE =存在发票SALESREF = 5001 &流量= H的任何数据”,它会diplays这样的: -

| PO_NO  | TYPE   | MOVEMENT_TYPE  | QUANTITY | SALESREF | FLOW | 
|---------- |----------- |--------------- |---------- |---------- |------ | 
| 10001001 | G.RECEIPT  | 122    | 1000.00 | 5001  | H  | 

我该怎么办呢?

修订

这是我当前的查询

SELECT * FROM dbo.INVOICE 
WHERE MVT_TYPE = '122' and TYPE NOT IN (SELECT TYPE FROM DBO.PO where flow ='H') 
+0

欢迎来到SO。你不能同时拥有MYSQL和SQL-SERVER;请编辑只留下正确的一个。 – Eli

+1

至于你的问题,你试过一个查询,并得到错误的结果? – Eli

+0

@ Eli ..我只是更新了我的文章 – Safwan

回答

2

使用NOT EXISTS:

SELECT * 
FROM dbo.INVOICE 
WHERE SALESREF = 5001 AND FLOW = 'H' AND NOT EXISTS (SELECT 1 
FROM dbo.INVOICE 
WHERE SALESREF = 5001 AND FLOW = 'H' AND TYPE = 'INVOICE') 

所有SALESREFs:

SELECT * 
FROM dbo.INVOICE i 
WHERE FLOW = 'H' AND NOT EXISTS (SELECT 1 
FROM dbo.INVOICE 
WHERE FLOW = 'H' AND TYPE = 'INVOICE' AND SALESREF = i.SALESREF) 
+0

@safwan是你正在寻找的答案吗? – Ashu

+0

谢谢你的回答。但是如果我得到另一个超过1的SALESREF除了salesref = 5001? – Safwan

+0

@Safwan'SELECT 1'只是帮助EXISTS条款返回TRUE – cloudsafe

0

您可以使用相关NOT EXISTS:

SELECT * FROM dbo.INVOICE i 
WHERE type='G.RECEIPT' 
AND NOT EXISTS(
SELECT * FROM dbo.INVOICE i2 
WHERE type='INVOICE' 
AND i.PO_NO=i2.PO_NO 
AND i.QUANTITY=i2.QUANTITY 
AND i.SALESREF=i2.SALESREF 
AND i.FLOW=i2.FLOW 
) 

这更一般处理的要求,所以它得到所有G.RECEIPT没有的匹配INVOICE,而无需为SALESREF或任何其他列进行硬编码。

相关问题