【问题标题】:SQL Server : JoinSQL Server:加入
【发布时间】:2009-08-05 12:05:55
【问题描述】:

前两列来自一组查询语句,其余列来自另一组。 我想在一行中显示值。谁能帮帮我

A      B      C      D

NULL   NULL   0      22

0      699    NULL   NULL

SELECT 语句:

SELECT P.A, P.B, T2.C, T2.D 
FROM Table1 AS P 
JOIN (
    SELECT MAX(ID) ID, COUNT(ID) AS A 
    FROM Table1 
    WHERE Type = 0 
    GROUP BY Type) AS A1 
  ON A1.ParcelID = P.ID 
RIGHT OUTER JOIN (
    SELECT MAX(ID) ID, COUNT(ID) AS B 
    FROM Table1 
    WHERE Type = 1 GROUP BY Type) AS B1 
  ON B1.ID = P.ID 
FULL JOIN (
    SELECT R.ID,ISNULL(C1.C,0) C, ISNULL(D1.D,0) D 
    FROM Table2 AS R 
    FULL JOIN (
        SELECT MAX(ID) ID, COUNT(ID) AS C 
        FROM Table2 
        WHERE Type = 0 
        GROUP BY Type) AS C1 
      ON C1.ID = R.ID 
    RIGHT OUTER JOIN (
        SELECT MAX(ID) ID, COUNT(ID) AS D 
        FROM Table2 
        WHERE Type = 1 
        GROUP BY Type) AS D1 
      ON D1.ID = R.ID) AS T2 
  ON T2.ID = P.ID

【问题讨论】:

  • 你用的是什么数据库引擎?
  • 两者之间是否有任何共同的字段,以便您可以将它们捆绑在一起?
  • 我们可能需要有关查询的更多详细信息来帮助您...
  • 有一个字段,但我需要所有记录。我会给出查询的语法

标签: sql sql-server join


【解决方案1】:

您可以使用 UNION ALL 来做到这一点。只需使用您的表格而不是我在下面的示例中声明的@TableVariables。

SET NOCOUNT ON

DECLARE @Temp1 TABLE 
(
    DataColumn1 VarChar (100),
    DataColumn2 VarChar (100),
    DataColumn3 VarChar (100),
    DataColumn4 VarChar (100)
)

DECLARE @Temp2 TABLE 
(
    DataColumn1 VarChar (100),
    DataColumn2 VarChar (100),
    DataColumn3 VarChar (100),
    DataColumn4 VarChar (100)
)

insert into @Temp1 Values (NULL, NULL, 0, 22)
insert into @Temp1 Values (NULL, NULL, 0, 23)
insert into @Temp1 Values (NULL, NULL, 0, 24)
insert into @Temp2 Values (0, 697, NULL, NULL)
insert into @Temp2 Values (0, 698, NULL, NULL)
insert into @Temp2 Values (0, 699, NULL, NULL)

SELECT 
    DataColumn1, 
    DataColumn2, 
    DataColumn3, 
    DataColumn4
FROM @Temp1

UNION ALL

SELECT 
    DataColumn1, 
    DataColumn2, 
    DataColumn3, 
    DataColumn4
FROM @Temp2

【讨论】:

  • 提问者是否要求存储过程类型的答案?我不得不承认,这种方法更容易理解。
【解决方案2】:

如果您对您的内容更具体一点,我可以为您提供更好的帮助,但我会尝试任何方式。如果我理解你,你可以这样做

选择 一种, 乙, NULL AS c, NULL AS D FROM 查询 1

联合所有

选择 空作为一个, NULL AS B, C, D FROM 查询 2

最好的问候, 约旦

【讨论】:

  • 为什么投反对票?这个问题很开放,所以答案是正确的
【解决方案3】:

如果您的评论中有一个公共字段,则将其与内部联接一起使用:

选择 A、B、C、D 从表 1 INNER JOIN Table2 ON (Table1.CommonField = Table2.CommonField)

这将产生一个所有四列都在一行中的结果。这假定 CommonField 是至少一个表中的候选键。如果另一个表的 CommonField 为 NULL,您可能需要将 INNER JOIN 调整为 LEFT JOIN,具体取决于您是否需要一个表中的所有字段。此外,如果您需要两个表中的所有行,而不管相应表中是否存在匹配行,您将需要使用 LEFT JOIN 并编写两次查询(一次是 Table1 加入 Table2,一次是表 2 加入 Table1 ) 并将它们联合在一起 - 类似于其他答案,仅考虑公共字段。

编辑:这个怎么样:

SELECT A1.A, B1.B, T2.C, T2.D 
FROM    (
            SELECT MAX(ID) ID, COUNT(ID) AS A 
            FROM Table1 WHERE Type = 0 GROUP BY Type
        ) AS A1 ON A1.ID = P.ID 
    FULL OUTER JOIN (
                SELECT MAX(ID) ID, COUNT(ID) AS B 
                FROM Table1 WHERE Type = 1 GROUP BY Type
            ) AS B1 ON B1.ID = A1.ID 
    FULL OUTER JOIN (
                SELECT MAX(ID) ID, COUNT(ID) AS C 
                FROM Table2 WHERE Type = 0 GROUP BY Type
            ) AS C1 ON C1.ID = A1.ID 
    FULL OUTER JOIN (
                SELECT MAX(ID) ID, COUNT(ID) AS D 
                FROM Table2 WHERE Type = 1 GROUP BY Type
            ) AS D1 ON D1.ID = A1.ID

【讨论】:

  • AS D1 ON D1.ID = R.ID) AS T2 ON T2.ID = P.ID 在这里我正在做同样的事情,我尝试了所有类型的连接。我得到正确的值,但作为两行。但对于我的 MIS,它应该是单行
猜你喜欢
  • 1970-01-01
  • 2012-09-01
  • 2012-04-01
  • 2011-09-06
  • 2012-10-07
  • 2011-11-06
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多