【问题标题】:How do I join two tables with different column in SQL Server CE?如何在 SQL Server CE 中连接两个具有不同列的表?
【发布时间】:2012-05-16 12:49:58
【问题描述】:

如何在 SQL Server CE 中连接两个具有不同列的表?

我有两张桌子:

时间表

+-----+----------+------+
+ ID  + Name     + Type +
+-----+----------+------+
+ 1   + A        + 1    +
+ 2   + B        + 1    +
+ 3   + C        + 2    +
+-----+----------+------+

表格说明

+-----+--------------------+
+ ID  + Description        +
+-----+--------------------+
+ 1   + A1 - XXXXX         +
+-----+--------------------+

而我想要得到的是这样的表格:

+-----+----------+-----------------+
+ ID  + Name     + Description     +
+-----+----------+-----------------+
+ 1   + A        + A1 - XXXXX      +
+ 2   + B        + -               +
+ 3   + C        + -               +
+-----+----------+-----------------+

当 ID 不在 Description 表中时,Description 列应由 - 填写。

我试过这段代码:

SELECT S.ID, D.Description 
FROM Schedule AS S 
INNER JOIN Description AS D

但是导致:

+-----+----------+-----------------+
+ ID  + Name     + Description     +
+-----+----------+-----------------+
+ 1   + A        + A1 - XXXXX      +
+ 2   + B        + A1 - XXXXX      +
+ 3   + C        + A1 - XXXXX      +
+-----+----------+-----------------+

当我试图给出 ON 子句时:

SELECT S.ID, D.Description 
FROM Schedule AS S 
INNER JOIN Description AS D ON S.ID = D.ID

它只是获取IDDescription 表上的行,例如:

+-----+----------+-----------------+
+ ID  + Name     + Description     +
+-----+----------+-----------------+
+ 1   + A        + A1 - XXXXX      +
+-----+----------+-----------------+

我该怎么做?


[更新]

我试过这段代码,它可以工作:

SELECT  S.ID, S.Name, COALESCE (D.Description, '-') AS Description
FROM Schedule AS S 
LEFT OUTER JOIN Description AS D ON S.ID = D.ID

但是现在,如何在其上添加 WHERE 子句(请参见上面的表 SCHEDULE)?

我试过了:

SELECT  S.ID, S.Name, COALESCE (D.Description, '-') AS Description
FROM Schedule AS S 
LEFT OUTER JOIN Description AS D ON S.ID = D.ID AND S.Type = '1'

但仍然得到整行。

【问题讨论】:

    标签: tsql join sql-server-ce


    【解决方案1】:

    SQL Server CE 中的左外连接

    您需要使用LEFT OUTER JOIN 在关键字段ID 上加入表ScheduleDescription。另外,使用COALESCE 将Description 列中的NULL 值替换为-

    脚本:

    SELECT          S.ID
                ,   S.Name
                ,   COALESCE (D.Description, '-') AS Description
    FROM            Schedule AS S 
    LEFT OUTER JOIN Description AS D 
    ON              S.ID = D.ID
    

    输出:

    Microsoft SQL Server CE version 4.0.8482.1

    中测试

    带有 WHERE 子句

    您需要在 JOIN 之后添加 WHERE 子句。如果您打算使用ORDER BY,它应该在WHERE 子句之后。

    脚本:

    SELECT          S.ID
                ,   S.Name
                ,   COALESCE (D.Description, '-') AS Description
    FROM            Schedule    AS S 
    LEFT OUTER JOIN Description AS D 
    ON              S.ID = D.ID
    WHERE           (S.Type = 1)
    

    输出:

    Microsoft SQL Server CE version 4.0.8482.1

    中测试

    【讨论】:

    • 嗨,它有效。但结果仍然不是我想要的。请参阅上面更新的代码。
    • 不,现在可以了。但是如何在其上添加 WHERE 子句?请参阅上面更新的代码。 :)
    【解决方案2】:

    你需要LEFT OUTER JOIN

    SQLFiddle:http://sqlfiddle.com/#!3/7dccf/1

    查询:

    select s.ID, s.Name, Coalesce(d.description,'-') as description
    from schedule s 
    left outer join description d on d.id = s.id
    

    【讨论】:

      【解决方案3】:
      SELECT S.ID, D.Description 
      FROM Schedule AS S FULL OUTER JOIN Description AS D
      ON S.ID = D.ID
      

      INNER JOIN 表示只选择两个表中都存在的行。
      FULL OUTER JOIN 表示选择一个表中存在的行。

      你需要FULL OUTER JOIN...

      【讨论】:

      • 返回:Token in Error = JOIN。怎么了?我尝试了 INNER JOIN 并且它可以工作,但是当尝试 OUTER JOIN 时,它会返回消息。我的 SQL 是 ASP.Net 上的 SQL CE
      • @mrjimoy_05。试试FULL OUTER JOIN
      • 还是一样的,不过现在获取Token in Error = FULL.. >.
      • @mrjimoy_05。 Read this
      【解决方案4】:

      您需要使用OUTER JOIN 代替INNER,并使用IsNullCoalesce 替换NULL 值:

      SELECT S.ID, Coalesce(D.Description , '-') AS Description
      FROM Schedule AS S FULL OUTER JOIN Description AS D
      ON S.ID = D.ID
      

      【讨论】:

      • 它返回:Token in Error = JOIN。怎么了?我尝试了INNER JOIN 并且它有效,但是当尝试OUTER JOIN 时,它返回了消息..
      • 仅供参考 IsNull 不是 ANSI 标准,如果有疑问,您应该使用 COALESCE
      • @Ken White:我不确定为什么它现在有效。我更新了上面的代码,请看一下。如何在上面添加WHERE子句?
      猜你喜欢
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 2011-04-07
      • 2014-08-11
      • 2013-07-24
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多