【问题标题】:SQL Server: Can't figure out what join to useSQL Server:不知道要使用什么连接
【发布时间】:2018-07-09 16:07:32
【问题描述】:

我有以下表格:

价格输入

  • 汽车类型ID
  • 人员 ID
  • 价格日期
  • 价格值

车型

  • 身份证

  • 车名

  • 身份证
  • 姓名

我想要达到的结果是这个(获取所有人名):

2018 年 6 月 28 日星期四 Andy NULL NULL

2018 年 6 月 28 日星期四皮特奥迪 5000

2018 年 6 月 28 日星期四巴特奥迪 10000

但我拥有的是:

2018 年 6 月 28 日星期四皮特奥迪 5000

2018 年 6 月 28 日星期四巴特奥迪 10000

这是我的查询:

SELECT (
  DATENAME(dw, CAST(DATEPART(m, priceDate) AS VARCHAR) + '/' + CAST(DATEPART(d, priceDate) AS VARCHAR) + '/' + CAST(DATEPART(yy, priceDate) AS VARCHAR))
 + ' '+ FORMAT(priceDate, 'dd MMMM yyyy') )as 'Entering Date', p.Name as 'Person Name', CarName as 'CarName' , REPLACE(ap.priceValue,'.',',') as 'Price'
FROM PriceEntry ap 
FULL JOIN CarType at 
ON ap.CarTypeID = at.id
FULL JOIN Person p 
ON ap.PersonId = p.ID 
order by priceDate desc

我做错了什么?

编辑

我的数据:

SELECT 
* from PriceEntry 
WHERE priceDate = '2018-07-09 00:00:00.000'

select count(*) as 'Person count' from person 

select count(*) as 'car count' from CarType

我今天使用查询返回的只有 1 行,而我希望今天为所有人返回的行

【问题讨论】:

  • 尝试 LEFT OUTER JOIN Person P
  • 正确标记!!! MySQL SQL 服务器!!!这是哪一个???
  • LEFT JOIN 返回的行数不会比 FULL JOIN 少吗?
  • 我也尝试使用左连接但没有结果(完全连接是我在这里询问之前的最后手段)
  • FULL JOIN 是 LEFT JOIN 和 RIGHT JOIN 的全部,因此将 FULL 减少到 LEFT 不会产生新行。

标签: sql sql-server join


【解决方案1】:

这是我对您的查询的建议:

SELECT DATENAME(dw, priceDate) + ' '+ FORMAT(priceDate, 'dd MMMM yyyy') )as Entering_Date,
       p.Name as Person_Name,
       at.CarName as Car_Name,
       REPLACE(ap.priceValue, '.', ',') as Price
FROM Person p LEFT JOIN
     PriceEntry ap 
     ON ap.PersonId = p.ID LEFT JOIN
     CarType at 
     ON ap.CarTypeID = at.id
ORDER BY ap.priceDate DESC;

注意事项:

  • 如果你想要所有人,那应该是left joins系列的第一个加入。
  • 您不需要从日期的日期部分构造日期来提取星期几。这种逻辑被简化了。
  • 单引号只能用于字符串和日期常量。
  • 我在列别名中添加了下划线,因此它们不需要转义。

编辑:

您在已编辑问题中的查询与您所描述的完全不同。解决方案就是将条件放在适当的on 子句中:

这是我对您的查询的建议:

SELECT DATENAME(dw, priceDate) + ' '+ FORMAT(priceDate, 'dd MMMM yyyy') )as Entering_Date,
       p.Name as Person_Name,
       at.CarName as Car_Name,
       REPLACE(ap.priceValue, '.', ',') as Price
FROM Person p LEFT JOIN
     PriceEntry ap 
     ON ap.PersonId = p.ID and ap.priceDate = '2018-07-09 LEFT JOIN
     CarType at 
     ON ap.CarTypeID = at.id
ORDER BY ap.priceDate DESC;

【讨论】:

  • 感谢您的回答,遗憾的是这不起作用,我得到的行与我的问题中返回的行完全相同
  • 检查数据,考虑将查询减少到仅连接到 1 个表等 - 你真的得到了 'ANdy' 记录吗?
  • 是的,我通过添加数据更新了我的问题。我今天有 1 个 priceEntry 记录和 800 多人,但查询仍然只返回今天的 1 行
  • @user3127554 。 . .您的编辑显着改变了问题。我已经更新了答案。
  • @user3127554 。 . .这个问题明确地是关于让所有人。所有日期都将是一个新问题,应作为一个新问题提出,提供样本数据、所需结果以及您想要完成的任务的说明。
【解决方案2】:

差不多了。你需要使用LEFT JOIN:

SELECT (
    DATENAME(dw, CAST(DATEPART(m, priceDate) AS VARCHAR) + '/' 
      + CAST(DATEPART(d, priceDate) AS VARCHAR) + '/' 
      + CAST(DATEPART(yy, priceDate) AS VARCHAR))
      + ' '+ FORMAT(priceDate, 'dd MMMM yyyy') )as 'Entering Date', 
    p.Name as 'Person Name', 
    CarName as 'CarName' , 
    REPLACE(ap.priceValue,'.',',') as 'Price'
  FROM PriceEntry ap 
  LEFT JOIN CarType at ON ap.CarTypeID = at.id -- LEFT JOIN here!
  LEFT JOIN Person p ON ap.PersonId = p.ID -- LEFT JOIN here!
  ORDER BY priceDate desc

【讨论】:

  • “这不起作用”不是答案。怎么了?一个错误,它显示错误的行?
  • 抱歉没有具体说明,它显示的结果与我的问题完全相同
  • 老实说,我看不出将 FULL 放到 LEFT 会有更多的行数
  • 不可能有比FULL更多的行
  • 是的,FULL JOIN 应该已经显示了所有内容。您可以发布 DDL 以在本地运行它吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 2010-09-27
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多