我有三张table:
___发票:
|--------|---------------|
| 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` 实际上是空的,因为在我的发票和预订和kardex之间没有任何现有的like。
因此,我的尝试如下:
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` table。
你知道为什么吗?
这里是sql小提琴:http://sqlfiddle.com/#!2011年9月1日
谢谢。
4条答案
按热度按时间83qze16e1#
我不太确定你的关系或外键。但从你所付出的来看,我想这也行。可能需要稍加修改,但我想你会明白的。
请检查一下,告诉我这是不是你想要的。
http://sqlfiddle.com/#!2011年9月1日
如果你有任何疑问,尽管问。希望有帮助:)
dnph8jn42#
你可以试试
如果您关心的是性能,那么这可能不是最佳的解决方案,但是在您的模式设计中,您不应该让一个表处理多种类型的信息,这使得编写任何合法的联接都很困难。
mum43rcc3#
请检查您的第二个加入查询:
应该是的
sql小提琴:http://sqlfiddle.com/#!2017年9月21日
bnlyeluc4#
您将以0的帐单ID加入\uuu kardex。
0不等于89或90
我是这样解决的:我加入到同一个表两次,每次都有不同的连接条件。然后为该联接创建了一个新别名:
结果