我有三张桌子:
__发票:

|--------|---------------|
| INV_Id | IVC_BookingId |
|--------|---------------|
| 10     | 31            |
|--------|---------------|

__预订:
|--------|-------------|---------------|---------------|
| BOO_Id | BOO_GuestId | BOO_CompanyId | BOO_BillingId |
|--------|-------------|---------------|---------------|
| 10     | 89            90            | 0             |
|--------|-------------|---------------|---------------|

__卡德克斯:
|--------|----------|-------------|-------------|
| KDX_Id | KDX_Type | KDX_Name    | KDX_Company |
|--------|----------|-------------|-------------|
| 89     | guest    | Frank       |             |
| 90     | company  |             | Google      |
|--------|----------|-------------|-------------|

我想找一个发票的链接卡用户。
例如,对于INV_Id = 10,它应该返回我:
|--------|-------|---------|---------|
| INV_Id | guest | company | billing |
|--------|-------|---------|---------|
| 10     | Frank | Google  | 0       |
|--------|-------|---------|---------|

billing实际上是空的,因为我的发票和预订卡和卡德克斯之间没有任何类似的东西。
所以我的尝试如下:
SELECT IVC_Id, IVC_BookingId, IFNULL(BOO_GuestId, 0) AS BOO_GuestId, IFNULL(BOO_CompanyId, 0) AS BOO_CompanyId, IFNULL(BOO_BillingId, 0) AS BOO_BillingId, KDX_Name, KDX_Company
FROM ___Invoices
JOIN ___Bookings
ON ___Bookings.BOO_Id = ___Invoices.IVC_BookingId
LEFT JOIN ___Kardex
ON ___Kardex.KDX_Id = ___Bookings.BOO_BillingId
WHERE IVC_Id='10'

我没有错,但我可以从___Kardex表中获取名称或公司。
你知道为什么吗?
这里的sql小提琴:http://sqlfiddle.com/#!9/211d01/1
谢谢。

最佳答案

我不太确定你的关系和外键。但从你所付出的来看,我认为这是可行的。可能需要稍加修改,但我想你会明白的。

SELECT ___Invoices.IVC_Id, k1.KDX_Name as guest, k2.KDX_Company as company
FROM ___Invoices
JOIN ___Bookings
ON ___Bookings.BOO_Id = ___Invoices.IVC_BookingId
LEFT JOIN ___Kardex k1 ON ___Bookings.BOO_GuestId = k1.KDX_Id
LEFT JOIN ___Kardex k2 ON ___Bookings.BOO_CompanyId = k2.KDX_Id
WHERE ___Invoices.IVC_Id='10'

请检查一下,告诉我这是不是你想要的。
http://sqlfiddle.com/#!9/211d01/31
如果您有任何疑问,请随时询问。希望有帮助:)

10-06 03:48