Sql server 加入不成功时显示0

Sql server 加入不成功时显示0,sql-server,join,Sql Server,Join,我正在使用SQL Server解决以下问题 我有三张桌子T1,T2,T3 T1: ID Name Country ---------------------- 1 PR IN 2 AR US ID AGE ------------ 1 32 2 36 3 40 ID T1_ID T2_ID Amount -------------------------------- 1

我正在使用SQL Server解决以下问题

我有三张桌子T1,T2,T3

T1

ID    Name    Country
----------------------
 1     PR      IN
 2     AR      US
 ID     AGE
------------
 1      32
 2      36
 3      40
 ID     T1_ID    T2_ID   Amount
--------------------------------
 1       1         1       100
 2       1         2       300
SELECT T1.NAME, 
       T2.age, 
       ISNULL((SELECT amount 
               FROM   T3 
               WHERE  T1.id = T3.T1_id 
                      AND T2.id = T3.T2_id), 0) AS Amount 
FROM   T2 CROSS JOIN 
       T1
WHERE  T1.id = 1 
T2

ID    Name    Country
----------------------
 1     PR      IN
 2     AR      US
 ID     AGE
------------
 1      32
 2      36
 3      40
 ID     T1_ID    T2_ID   Amount
--------------------------------
 1       1         1       100
 2       1         2       300
SELECT T1.NAME, 
       T2.age, 
       ISNULL((SELECT amount 
               FROM   T3 
               WHERE  T1.id = T3.T1_id 
                      AND T2.id = T3.T2_id), 0) AS Amount 
FROM   T2 CROSS JOIN 
       T1
WHERE  T1.id = 1 
T3

ID    Name    Country
----------------------
 1     PR      IN
 2     AR      US
 ID     AGE
------------
 1      32
 2      36
 3      40
 ID     T1_ID    T2_ID   Amount
--------------------------------
 1       1         1       100
 2       1         2       300
SELECT T1.NAME, 
       T2.age, 
       ISNULL((SELECT amount 
               FROM   T3 
               WHERE  T1.id = T3.T1_id 
                      AND T2.id = T3.T2_id), 0) AS Amount 
FROM   T2 CROSS JOIN 
       T1
WHERE  T1.id = 1 
所需输出

T1.Name     T2.Age     T3.Amount
---------------------------------
 PR            32        100
 PR            36        200
 PR            40         0
我的问题是:

select 
    T1.name, T2.Age, T3.amount 
from 
    T3 
join 
    T1 on T1.id = T3.T1_ID --fixed a typo here
right join 
    T2 on T2.id =  T3.T2_ID
where 
    T1.id = 1
我当前的输出是:

    T1.Name     T2.Age     T3.Amount
    --------------------------------
      PR         32        100
      PR         36        200

我非常感谢您在这方面提供的任何帮助,因为您希望T2和T1的所有记录都是笛卡尔积,并且受到位置的限制

使用T3的子选择,而不是将T3加入来自的,允许您使用ISNULL

ID    Name    Country
----------------------
 1     PR      IN
 2     AR      US
 ID     AGE
------------
 1      32
 2      36
 3      40
 ID     T1_ID    T2_ID   Amount
--------------------------------
 1       1         1       100
 2       1         2       300
SELECT T1.NAME, 
       T2.age, 
       ISNULL((SELECT amount 
               FROM   T3 
               WHERE  T1.id = T3.T1_id 
                      AND T2.id = T3.T2_id), 0) AS Amount 
FROM   T2 CROSS JOIN 
       T1
WHERE  T1.id = 1 

您的
where
子句不允许空值,因此联接变成
internal
而不是
right
。即使删除where子句,我也无法获得所需的输出您确定这是您所需的输出吗?从你所展示的数据来看,对于第三排来说,这是不可能的,我不认为你的名字是PR,因为PR的ID是1。此外,它应该是唯一的年龄填充我假设金额和名称应为空,如果你想第三行,即使它有空的名称和金额,只有年龄显示我同意它。您能帮我了解一下语法吗?在ANSI-92 SQL标准中(25多年前),旧样式的逗号分隔表样式被正确的ANSI
JOIN
语法所取代,不鼓励使用它。如果你真的想要一个笛卡尔积,使用交叉连接谢谢,marc_s,更明确一点,不要用逗号