我有3个表,我试图加入一个在所有表格中都相同的字段,但这些表格并不是相关的。
TableA :
Account_Number | merchant_name | sale_date
123456789 | merchant 1 | 04-22-2016
123456789 | merchant 2 | 03-25-2016
123456789 | merchant 3 | 02-26-2016
TableB :
Account_Number | authorization_date | authorization_amount
123456789 | 04-22-2016 | 23
123456789 | 03-5-2016 | 55
TableC :
Account_Number
123456789
由于这些表格没有关系相关,因此它们只有每个表格可能具有的相似列值,我对这个输出与响应中显示6条记录的方式有何不同感到困惑,对于表中的每条记录,它将为每个表中的每个值提供唯一的记录。
如果我想让每个表中显示空值的响应,这可能吗?如果我外连接表,我应该看到不存在的字段的空值,但这似乎不起作用。
也许我对外连接如何工作感到困惑,但我理解所有记录都从所有表中返回,但对于不存在的字段返回NULL。下面是我的查询和响应,它显示总共6条记录,这是准确的,但是在记录中添加其他表数据,这使得它有点混乱,难以减少重复。
查询:
SELECT A.merchant_Name, A.sale_date, B.authorization_date, B.authorization_amount, C.account_number
FROM (TableA AS A
LEFT OUTER JOIN TableB AS B ON A.[account_number] = B.[account_number])
LEFT OUTER JOIN TableC AS C ON A.[account_number] = C.[account_number]
WHERE (((A.account_number)='123456789'))
ORDER BY A.sale_date, B.authorization_date;
输出:
merchant_Name|sale_date|authorization_date|authorization_amount|acct
merchant 3 02-26-2016 03-05-2016 55 123456789
merchant 3 02-26-2016 04-22-2016 23 123456789
merchant 2 03-25-2016 03-05-2016 55 123456789
merchant 2 03-25-2016 04-22-2016 23 123456789
merchant 1 04-22-2016 03-05-2016 55 123456789
merchant 1 04-22-2016 04-22-2016 23 123456789
如果基于account_number存在值,则需要对所有三个字段进行响应。有类似下面的内容吗?
merchant_name | sale_date | authorization_date | authorization_amount | acct
merchant 3 | 02-26-2016| null | null | null
merchant 2 | 03-25-2016| null | null | null
merchant 1 | 04-22-2016| null | null | null
null | null | 03-05-2016 | 55 | null
null | null | 04-22-2016 | 23 | null
null | null | null | null | 123456789
答案 0 :(得分:1)
使用OUTER JOINS,您不会使用此查询获取任何NULL值,因为联接在帐号上,并且每个表都有匹配的记录。
您可以使用UNION ALL查询获得所需的结果,该查询获取单独查询的结果并将它们一个接一个地添加到一起。
尝试此查询:
SELECT A.merchant_Name, A.sale_date, NULL AS authorization_date,
NULL AS authorization_amount, NULL AS acct
FROM tableA A
WHERE A.account_number = '123456789'
UNION ALL
SELECT NULL, NULL, b.authorization_date, b.authorization_amount, NULL
FROM tableB B
WHERE B.account_number = '123456789'
UNION ALL
SELECT NULL NULL, NULL, NULL, C.account_number
FROM tableC C
WHERE C.account_number = '123456789';