Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server中的联接查询问题_Sql_Sql Server_Tsql - Fatal编程技术网

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和产品的空值