我有一个包含两个表Weeks
和Users
的小数据库。
每个用户都可以有一个星期,所以我们可以说他可以有一个星期,但一定不能。
每个Week
都有一个WeekNr
。我想为特定的WeekNr
做一个类似的表格,其中所有用户都会显示那些没有周WeekNr
的用户:
-------------------------------------------+
| Users | KM Driven | Goal | CarID |
+----------+------------+------------------+
| Driver1 | 555 | Spain | 1 |
+----------+------------+------------------+
| Driver2 | 0 | 0 | 0 |
+----------+------------+------------------+
| Driver3 | 777 | Germany | 9 |
+----------+------------+------------------+
| Driver4 | 888 | UK | 86 |
+----------+------------+------------------+
如果某个user
对Week
没有WeekNr
,我希望所有列都预期他的名字会填充0
。有关示例,请参阅上表中的Driver2
。
我的查询看起来实际上是这样的:
SELECT *
FROM User
INNER JOIN Week ON Week.UserId = User.UserID
WHERE WeekNr = 22;
我完全理解为什么我只会为特定WeekNr
获得只有周数的驱动程序,但我不知道如何使用0
填充空的驱动程序来解决问题所有这一切都在一个查询中。
我希望我的问题得到澄清。
提前感谢您的帮助!
修改
我的表格看起来像这样
用户:
---------------------------------+
| User | PW | UserID |
+----------+------------+--------+
| Driver1 | *** | 1 |
| Driver2 | *** | 2 |
| Driver3 | *** | 3 |
| Driver4 | *** | 4 |
+----------+------------+--------+
周:
------------------------------------------------------+
| WeekNr | KM Driven | Goal | WeekID | UserID |
+----------+------------+-----------------------------+
| 22 | 555 | Spain | 1 | 1 |
| 22 | 0 | USA | 2 | 3 |
| 22 | 777 | Germany | 3 | 4 |
| 23 | 888 | UK | 44 | 2 |
+----------+------------+-----------------------------+
答案 0 :(得分:1)
我希望能够正确理解您的问题:您的问题出在INNER JOIN中,您只能获得两个表中的行。尝试LEFT OUTER:
编辑: 这应该是诀窍,给出额外的信息:)
;WITH Drivers AS (SELECT u.[User], w.*
FROM Users u LEFT OUTER JOIN Weeks w On w.UserId = u.UserID
WHERE WeekNr = 22)
SELECT u.[User], ISNULL(d.[KM Driven], 0) [KM Driven] , ISNULL(d.Goal, 0) Goal --, *
FROM Users u LEFT OUTER JOIN Drivers d ON u.UserID = d.UserID
答案 1 :(得分:1)
你的问题中有拼写错误吗?我认为CarID是一个Weeks专栏。如果是的话,
SELECT
u.[User]
, ISNULL(w.[KM Driven], 0) [KM Driven]
, ISNULL(w.[Goal], '0') [Goal]
, ISNULL(w.[CarID], 0) [CarID]
FROM dbo.[Users] u
LEFT JOIN Weeks w ON u.UserID = w.UserID AND WeekNr = 22