2013-07-24 47 views
0

我有一个SQL查询,我必须从两个不同的表中获取值(说a1,a2)。出于简单的原因,它的工作原理,但因为我有一个UNION在同一个查询中有一个重要的原因(从表a2中获取值放置在a1的列值之间),由于这个原因,我的查询结果变得很奇怪。这是我的查询和图像,它显示了同样TICKET_ID的重复条目,我想删除它,怎么样?在两个表中显示两个表与一个UNION

QUERY

SELECT 
RECEIPTS.DATENEW AS DATE, 
TICKETS.TICKETID AS TICKETID, 
PAYMENTS.PAYMENT AS PAYMENT, 
PAYMENTS.TOTAL AS TOTAL, 
CUSTOMERS.NAME AS NAME, 
ADJUSTMENTS.ADJUSTMENT_REASON AS REASON 
FROM RECEIPTS 
INNER JOIN TICKETS ON RECEIPTS.ID = TICKETS.ID 
INNER JOIN PAYMENTS ON RECEIPTS.ID = PAYMENTS.RECEIPT 
INNER JOIN CUSTOMERS ON TICKETS.CUSTOMER = CUSTOMERS.ID 
RIGHT JOIN ADJUSTMENTS ON ADJUSTMENTS.CUSTOMER_ID = CUSTOMERS.ID 
WHERE 
(PAYMENTS.PAYMENT = 'debt' 
OR PAYMENTS.PAYMENT = 'debtpaid') 
UNION SELECT 
ADJUSTMENTS.DATE AS DATE, 
ADJUSTMENTS.TICKET_NO AS TICKETID, 
ADJUSTMENTS.ADJUSTMENT_TYPE AS PAYMENT, 
ADJUSTMENTS.ADJUSTMENT_AMOUNT * -1 AS TOTAL, 
ADJUSTMENTS.CUSTOMER_NAME AS NAME, 
ADJUSTMENTS.ADJUSTMENT_REASON AS REASON 
FROM ADJUSTMENTS 
ORDER BY NAME ASC, DATE DESC 

,这里是它的输出图像

输出

enter image description here

+0

换另一个查询各地工会,并用它来筛选受骗者? –

+0

你会再详细一点吗? – Saqib

回答

0

最后我想通了,现在查询变得如下

SELECT 
RECEIPTS.DATENEW AS DATE, 
TICKETS.TICKETID AS TICKETID, 
PAYMENTS.PAYMENT AS PAYMENT, 
PAYMENTS.TOTAL AS TOTAL, 
CUSTOMERS.NAME AS NAME, 
(SELECT ADJUSTMENTS.ADJUSTMENT_REASON FROM ADJUSTMENTS WHERE ADJUSTMENTS.ADJUSTMENT_TYPE != 'adjustment' AND ADJUSTMENTS.ADJUSTMENT_REASON != '') AS REASON 
FROM RECEIPTS 
INNER JOIN TICKETS ON RECEIPTS.ID = TICKETS.ID 
INNER JOIN PAYMENTS ON RECEIPTS.ID = PAYMENTS.RECEIPT 
INNER JOIN CUSTOMERS ON TICKETS.CUSTOMER = CUSTOMERS.ID 
WHERE 
(PAYMENTS.PAYMENT = 'debt' 
OR PAYMENTS.PAYMENT = 'debtpaid') 
UNION SELECT 
ADJUSTMENTS.DATE AS DATE, 
ADJUSTMENTS.TICKET_NO AS TICKETID, 
ADJUSTMENTS.ADJUSTMENT_TYPE AS PAYMENT, 
ADJUSTMENTS.ADJUSTMENT_AMOUNT * -1 AS TOTAL, 
ADJUSTMENTS.CUSTOMER_NAME AS NAME, 
ADJUSTMENTS.ADJUSTMENT_REASON AS REASON 
FROM ADJUSTMENTS 
ORDER BY NAME ASC, DATE DESC 
1

您可以使用GROUP BY或只是检查原因列不null

SELECT q.* FROM (

SELECT 
RECEIPTS.DATENEW AS DATE, 
TICKETS.TICKETID AS TICKETID, 
PAYMENTS.PAYMENT AS PAYMENT, 
PAYMENTS.TOTAL AS TOTAL, 
CUSTOMERS.NAME AS NAME, 
ADJUSTMENTS.ADJUSTMENT_REASON AS REASON 
FROM RECEIPTS 
INNER JOIN TICKETS ON RECEIPTS.ID = TICKETS.ID 
INNER JOIN PAYMENTS ON RECEIPTS.ID = PAYMENTS.RECEIPT 
INNER JOIN CUSTOMERS ON TICKETS.CUSTOMER = CUSTOMERS.ID 
RIGHT JOIN ADJUSTMENTS ON ADJUSTMENTS.CUSTOMER_ID = CUSTOMERS.ID 
WHERE 
(PAYMENTS.PAYMENT = 'debt' 
OR PAYMENTS.PAYMENT = 'debtpaid') 
UNION SELECT 
ADJUSTMENTS.DATE AS DATE, 
ADJUSTMENTS.TICKET_NO AS TICKETID, 
ADJUSTMENTS.ADJUSTMENT_TYPE AS PAYMENT, 
ADJUSTMENTS.ADJUSTMENT_AMOUNT * -1 AS TOTAL, 
ADJUSTMENTS.CUSTOMER_NAME AS NAME, 
ADJUSTMENTS.ADJUSTMENT_REASON AS REASON 
FROM ADJUSTMENTS 
ORDER BY NAME ASC, DATE DESC) q GROUP BY q.TICKETID 

OR

ORDER BY NAME ASC, DATE DESC) q GROUP BY q.REASON !='' // q.REASON IS NOT NULL 
+0

那么工作好但是问题是REASON的右栏没有显示数据,为什么?它是空的! – Saqib

+0

对不起,它没有工作......它隐藏所有的调整字段,只显示一个,而我需要显示所有调整字段有或没有原因列值:( – Saqib

+0

在这种情况下,您的原始查询是正确的 –