0

我有四张桌子:

T1

ID   ID1   TITLE
1    100   TITLE1
2    100   TITLE2
3    100   TITLE3

T2

ID  TEXT
1   LONG1
2   LONG2

T3

ID1  ID2
100  200

T4

  ID4  ID2   SUBJECT
   1    200    A
   2    200    B
   3    200    C
   4    200    D
   5    200    E

我想要以这种结果格式输出:

TITLE    TEXT   SUBJECT

TITLE1   LONG1    A
TITLE2   LONG2    B
TITLE3   null     C
null     null     D
null     null     E

所以我做了这个查询,但它给我的结果比它应该的要多得多。在示例标题上显示的次数不仅仅是一次等等。

SELECT 
    t1.title,
    t2.text,
    t4.subject
FROM t1
    LEFT OUTER JOIN t2 ON t1.id=t2.id
    INNER JOIN t3      ON t1.id1=t3.id1
    LEFT OUTER JOIN t4 ON t4.id2=t3.id2
WHERE 
    t1.id1=100

感谢帮助

4

5 回答 5

1

免责声明:我不使用 DB2。在浏览了一些文档之后,我发现 DB2 支持row_number()full external join,但我可能很容易出错。

要摆脱 n:m 关系,必须建立额外的密钥。在这种情况下,简单的解决方案是将行号添加到 t1 和 t4 中的每条记录,并将其用作连接条件。Row_number 就是这样做的,它为由 定义的数据组partition by按升序生成数字order by

由于 t1 和 t4 的记录数存在差异,并且不知道哪一个总是有更多的记录,所以我使用完全外连接来连接它们。

可以看到测试(Sql Server 版本)@Sql Fiddle

select t1_rn.title,
       t2.[text],
       t4_rn.subject
from
(
  select t1.id,
         t1.title,
         t1.id1,
         t3.id2,
         row_number() over(partition by t1.id1
                           order by id) rn
    from t1
   inner join t3
      on t1.id1 = t3.id1
) t1_rn
full outer join
(
  select t4.subject,
         t3.id1,
         t4.id2,
         row_number() over(partition by t4.id2 
                           order by id4) rn
    from t4
   inner join t3
      on t4.id2 = t3.id2
) t4_rn
  on t1_rn.id1 = t4_rn.id1
 and t1_rn.id2 = t4_rn.id2
 and t1_rn.rn = t4_rn.rn
left join t2
  on t1_rn.id = t2.id

这种工作绝对应该在应用程序的演示端完成,但我相信您使用的软件需要已经准备好的数据。

于 2012-06-06T00:47:29.287 回答
0

尝试这个 :

select t1.title,t2.text,t4.subject
from t4 
left join t3
on t4.id2=t3.id2
left join t1 
on t1.id1=t3.id1
left join t2
on t1.id=t2.id
where t1.id=100
于 2012-06-05T13:54:37.120 回答
0

外连接保证复制行,而不是只匹配您需要的行。你可能想看看这个:http: //blog.sqlauthority.com/2009/04/13/sql-server-introduction-to-joins-basic-of-joins/

了解连接类型是什么,以及如何使用它们。

您正在寻找包含相关文本和标题的主题列表,但这可能不是唯一的;每个标题存在多个 null。您希望从表 4 中驱动连接,并获得一个主题列表,以及每个主题的相关标题。

于 2012-06-05T14:02:44.933 回答
0

查看您的输出,您似乎希望显示所有主题。了解这一点后,您应该首先在此表上构建所有内容。

SELECT columns
FROM T4

接下来建立你的内部连接。

SELECT columns
FROM T4 subjectTable
    INNER JOIN T3 mapTable
    ON mapTable.ID2 = subjectTable.ID2

如果对它们感到满意,请使用外部连接添加可选列。

SELECT columns
FROM T4 subjectTable
    INNER JOIN T3 mapTable
    ON mapTable.ID2 = subjectTable.ID2
    LEFT OUTER JOIN T2 textTable
    ON textTable.ID = subjectTable.ID4
    LEFT OUTER JOIN T1 titleTable
    ON titleTable.ID1 = mapTable.ID1
WHERE
    subjectTable.ID = 100;
于 2012-06-05T14:26:21.533 回答
0

你应该改变你的桌子。您的最后一次连接对您的输出执行此操作 - 只需分析您的查询。对于 T1 的每条记录,您都有 T4 的每条记录。

于 2012-06-05T13:57:20.237 回答