左连接没有产生正确的结果

时间:2017-10-02 14:51:28

标签: sql sql-server join

我想要归还所有人,无论他们是否在任何一天都有销售。我最初的解决方法是

SELECT 
    P.[Name], P.[id], 
    F.[DATE], F.[Figure], F.[id]
FROM
    Person P
LEFT JOIN 
    Figure F ON P.id = F.id

结果的一个例子是

 Name           id      DATE         Figure
--------------------------------------------
 Tom            1       2017-09-27   15
 Fred           2       2017-09-27   20
 Jane           3       2017-09-25   0
 Ben            4       2017-09-25   0

现在,只要我将日期限制在今天的日期,我就什么也得不到。

SELECT 
    P.[Name], P.[id], 
    F.[DATE], F.[Figure], F.[id]
FROM
    Person P
LEFT JOIN 
    Figure F ON P.id = F.id
WHERE 
    F.Date = GETDATE()

我理解这可能是因为没有人附上今天的日期,但即使他们今天什么都没有,我怎么还能展示所有的人呢?我认为左连接会实现这一点,但事实并非如此。

我想要的结果是:

 Name           id      DATE         Figure
--------------------------------------------
 Tom            1       2017-10-02   0
 Fred           2       2017-10-02   0
 Jane           3       2017-10-02   0
 Ben            4       2017-10-02   0

表中没有键,所以我觉得这可能就是为什么左连接没有按照我的预期工作,但有没有人有任何想法如何才能得到所需的结果?

2 个答案:

答案 0 :(得分:2)

首先,条件需要放在myComboBox.SelectedItem = ((List<MyType>)myComboBox.DataSource) .FirstOrDefault(a => a.prop2 == myType.prop2val); 子句而不是ON子句中,因为它在第二个表上。

其次,WHERE - 尽管它的名字 - 有一个时间组件。因此,将其转换为getdate()

date

答案 1 :(得分:0)

将您的查询放入cte然后从中拉出以获得所需的结果:

;with cte_example
as
(SELECT 
P.[Name], 
P.[id], 
F.[DATE], F.[Figure], F.[id]
FROM
Person P
LEFT JOIN Figure F
ON P.id = F.id)

select Name
       ,id
       ,cast(getdate() as date) as date
       ,case when date = convert(date, getdate()) then Figure else 0 end as Figure
from cte_example

我做了一个rextester example所以你可以看到

相关问题