SQL从一个与另一个表连接的表中获取所有数据

时间:2015-11-25 10:40:10

标签: sql sql-server

我有一个包含两个表WeeksUsers的小数据库。

每个用户都可以有一个星期,所以我们可以说他可以有一个星期,但一定不能。

每个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   |
+----------+------------+------------------+

如果某个userWeek没有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    |
+----------+------------+-----------------------------+

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