2012-03-28 27 views
0

我将尝试使用Ticket和Membership之间的左外连接。 但是,它不在Ticket上显示NULL值的外键。你能给我一些回答这个查询有什么问题吗? 谢谢。你有Oracle SQL开发人员如何显示外键的NULL值

FROM Ticket t, Production pro, Performance per, Price, Price_level, Booking, Customer, Customer_Concession ccons, Membership, Member_concession mcons 
WHERE t.performanceid = per.performanceid AND 
    t.PRODUCTIONID = Price.PRODUCTIONID AND 
    t.levelId = Price.levelId AND 
    Price.PRODUCTIONID = pro.PRODUCTIONID AND 
    Price.levelId = Price_level.levelId AND 
    Booking.bookingId (+) = t.bookingId AND 
    Customer.customerId = Booking.customerId AND 
    ccons.cConcessionId (+) = Customer.cConcessionId AND 
    Membership.membershipId (+) = t.membershipId AND 
    Membership.mConcessionId = mcons.mConcessionId 
ORDER BY t.ticketId 
+1

是您的选择缺少的第一位以上? – 2012-03-28 11:45:42

+2

你应该真的在使用SQL-92而不是古老的SQL-86格式来进行查询,它会让问题更容易解决。 – Ollie 2012-03-28 12:15:17

+0

发布整个查询。看起来你的外连接是从“t”到“membership”和“booking”,所以如果t.col为null,它将不会连接到其他表。 – 2012-03-28 12:17:03

回答

4

一个潜在问题是这两个条件:

Booking.bookingId (+) = t.bookingId AND 
    Customer.customerId = Booking.customerId AND 

既然你做一个外部联接Booking,当没有找到匹配它的列会显示为NULL;但那么你做一个正常的加入到Customer,所以这些行将被淘汰,因为NULL不能等于任何东西。您可能还想将第二行更改为外部联接。

但是,我不知道这是你的主要问题,因为我实际上并不完全明白你在问什么。 “外键的空值”是什么意思?你没有指定你的外键。

1

为了扩展Dave的观察,并给你一个SQL92语法的例子,请请学习它,远离Oracle自己的外部连接语法。

FROM 
TICKET t 
JOIN Performance per 
ON per.performance_id = t.performance_id 
JOIN Production pro 
ON pro.produciton_id = t.production_id 
JOIN PRICE pr 
ON pr.production_id = pro.production_id 
AND pr.levelId = t.level_id 
JOIN price_level pl 
ON pl.levelid = pr.levelid 
LEFT OUTER JOIN booking b 
on b.booking_id = t.booking_id 
LEFT OUTER JOIN customer cus 
on cus.customer_id = b.customer_id 
LEFT OUTER JOIN customer_concession cons 
ON cons.concession_id = cus.concession_id 
LEFT OUTER JOIN memebership m 
ON M.membership_id = t.membership_id 
LEFT OUTER JOIN membership_concession mc 
ON mc.mConcession_id = m.mConcession_id 
Order by t.ticketid