我正在尝试为已预订一个活动的人提供其他活动的门票。我有两个表,如
---Concerts----------------
| ConcertID | Concert |
---------------------------
| 101 | Mozart |
| 102 | Beethoven |
| 103 | Chopin |
---------------------------
---Tickets--------------------------------------------
| TicketNum | Name | email | ConcertID |
------------------------------------------------------
| 5001 | Amy Jones | aaa@aaa.com | 101 |
| 5002 | Amy Jones | aaa@aaa.com | 102 |
| 5003 | John Doe | bbb@bbb.com | 102 |
| 5004 | Adam Smith | ccc@ccc.com | 101 |
| 5005 | Jerry Coe | ddd@ddd.com | 102 |
------------------------------------------------------
我正在尝试构建一个像
这样的语句SELECT Tickets.email, Concerts.ConcertID, Concerts.Concert FROM Tickets, Concerts
WHERE (Show Concerts Not Booked)
AND Concerts.ConcertID = Tickets.ConcertID
AND email = "bbb.com"
这个节目然后返回两场音乐会,约翰·多伊没有被预订,即101莫扎特和102肖邦。
我正在努力的
我可以构建一个查询来显示他预订的音乐会的交集,但我无法显示他没有预订的音乐会。
感谢任何帮助。
答案 0 :(得分:3)
Select c.ConcertID, C.Concert
From Concerts c
Left join Tickets t On t.ConcertID = c.ConcertID
Where t.ConcertID is null and t.Name = 'John Doe'
会这样做。
没有别名可能会让事情变得更清晰
Select Concerts.ConcertID, Concerts.Concert
From Concerts
Left join Tickets On Tickets.ConcertID = Concerts.ConcertID
Where Tickets.ConcertID is null and Tickets.Name = 'John Doe'
想一想,如果你想要一份所有音乐会的名单以及John是否买了票 你会做的
Select *
From Concerts
Left join Tickets On Tickets.ConcertID = Concerts.ConcertID
Where Tickets.Name = 'John Doe'
并获取
101 Mozart NULL NULL NULL NULL
102 Beethoven 5003 John Doe bbb@bbb.com 102
103 Chopin NULL NULL NULL NULL
所以where语句中的额外条件会过滤掉没有票证的行。
那是令人恼火的,在玩@JungSu Heo的sql小提琴后,我觉得这很有效
Select *
From Concerts c
Left join Tickets t On t.ConcertID = c.ConcertID and t.Name = 'John Doe'
Where t.ConcertID is null
经过一番思考后才有意义,因为John Doe在where子句中被删除了。在join子句中执行,然后John Doe仅用于约束外连接。
谢谢你学到的东西,虽然我通常不会看到这样的东西,因为我有一个名字/预订者类型表。
答案 1 :(得分:1)
我无法理解为什么Tony的查询不起作用。你能试试吗?
SELECT c.ConcertID, c.Concert
FROM Concerts c
WHERE c.ConcertID NOT IN
(
SELECT ConcertID
FROM Tickets
WHERE Name = 'John Doe'
)
如果您在http://www.sqlfiddle.com/发布数据,我们将非常感谢您。容易测试。