SQL Server中的联接查询问题
以下是有效的查询,但有一些错误:SQL Server中的联接查询问题,sql,sql-server,tsql,Sql,Sql Server,Tsql,以下是有效的查询,但有一些错误: SELECT dbo.Booking.Cost, dbo.Booking.StatusID, dbo.Account.FirstName, dbo.Attendee.HelmetsPurchased AS ProductsPurchased, dbo.Attendee.GaragesPurchased, dbo.Attendee.SecondDriver AS [Driver Nam
SELECT dbo.Booking.Cost,
dbo.Booking.StatusID,
dbo.Account.FirstName,
dbo.Attendee.HelmetsPurchased AS ProductsPurchased,
dbo.Attendee.GaragesPurchased,
dbo.Attendee.SecondDriver AS [Driver Name]
FROM dbo.Booking
JOIN dbo.Attendee ON dbo.Booking.EventID = dbo.Attendee.EventID
JOIN dbo.Account ON dbo.Booking.UserID = dbo.Account.UserID
WHERE (dbo.Booking.EventID = 15)
输出:
生成的表的问题是列product purchased(购买的产品)和driver name(驱动程序名称)为每一行填充文本,在这种情况下,应该仅为包含
Drivername
和product purchased(购买的产品)的行填充文本。attendee表中只有一行有drivername
,为用户名标记填充了产品购买字段,而所有其他行对drivername
和产品都有空值。而不是表attendee上的内部联接
,您应该执行左联接。这将包括这两列也为null的行
SELECT b.Cost,
b.StatusID,
ac.FirstName,
at.HelmetsPurchased AS ProductsPurchased,
at.GaragesPurchased,
at.SecondDriver AS [Driver Name]
FROM dbo.Booking b
LEFT JOIN dbo.Attendee at ON b.EventID = at.EventID
LEFT JOIN dbo.Account ac ON b.UserID = ac.UserID
WHERE b.EventID = 15
如果不需要驱动程序名称,以下内容可能会有所帮助:
SELECT
B.EventId,
B.Cost,
B.StatusID,
A.FirstName,
SUM(AT.HelmetsPurchased) AS ProductsPurchased,
SUM(AT.GaragesPurchased) AS GaragesPurchased
FROM
dbo.Booking B
INNER JOIN
dbo.Account A ON B.UserID = A.UserID
LEFT OUTER JOIN
dbo.Attendee AT ON B.EventID = AT.EventID
WHERE (dbo.Booking.EventID = 15)
GROUP BY B.EventId, B.Cost, B.StatusId, A.FirstName
已尝试dbo.Booking LEFT外部联接dbo.Attendee在dbo.Booking.EventID=dbo.Attendee.EventID内部联接上,该联接提供相同的results@MrA您的WHERE
子句中是否有您未包含在问题中的引用与会者的内容?或者在FROM
的中添加一个表,使用上面的查询得到的结果是15行,虽然总共有9行eventId=15,但我想问题在于,一个用户ID相同的客户在attendee表中有6,7个条目,具有单独的ID,例如,一个客户购买了一张没有产品的票,用于某些活动,下次同一客户为同一活动购买了2张带有某些产品的门票。预订与与会者之间的关系如何?是1对1还是1对多?请以表格形式显示实际样本数据,而不是将数据描述为文字问题。另外,提及您正在使用的SQL Server版本也很有用,因为当使用较新的语言功能时,查询解决方案可能会有所不同。我得到的结果是15行,虽然总共有9行eventId=15,但我想问题在于,一个用户ID相同的客户机在attendee表中有6,7个条目,具有单独的ID,例如,一个客户为某个活动购买了一张没有产品的票,而下一次同一个客户为同一个活动购买了两张有产品的票。@A先生:听起来你有一对多的关系。问题是在哪里。每次预订是否有多个帐户或每次预订是否有多个与会者,或者两者都有?我建议您从您的问题涉及的每个表格中提供一小部分数据样本。@a先生:在这种情况下,根据您的数据,15条记录是准确的。如果您只需要9条记录,您可能希望准确地说明您正在尝试执行的操作。是的,但eventId=15的总预订量为9,因此只能显示9行,另外,为什么它混合了drivername和购买的产品,因为只有2行获得了这些列的值,而其余行获得了空值,所以它在9行中的7行应该具有drivername和产品的空值