sql联接表及其子表

sql联接表及其子表,sql,sql-server,Sql,Sql Server,假设以下示例表: +-----+-----+-----+ | ID1 | ID2 | VAL | +-----+-----+-----+ | A | X | 1 | | A | Y | 2 | | A | Z | 3 | | B | X | 4 | | B | Z | 5 | | C | Y | 6 | +-----+-----+-----+ 假设我对ID1=B感兴趣,并想将其与其他人进行比较。所需的输出将是: +----

假设以下示例表:

+-----+-----+-----+
| ID1 | ID2 | VAL |
+-----+-----+-----+
| A   | X   | 1   |
| A   | Y   | 2   |
| A   | Z   | 3   |
| B   | X   | 4   |
| B   | Z   | 5   |
| C   | Y   | 6   |
+-----+-----+-----+
假设我对
ID1=B
感兴趣,并想将其与其他人进行比较。所需的输出将是:

+---------+---------+---------+---------+---------+---------+---------+
| REF.ID1 | OTH.ID1 | REF.ID2 | REF.ID2 | REF.VAL | OTH.VAL |  DIFF   |
+---------+---------+---------+---------+---------+---------+---------+
| B       | A       | X       | X       | 4       | 1       |  3      |
| B       | A       | NULL    | Y       | NULL    | 2       | -2      |
| B       | A       | Z       | Z       | 5       | 3       |  2      |
| B       | B       | X       | X       | 4       | 4       |  0      |
| B       | B       | Z       | Z       | 5       | 5       |  0      |
| B       | C       | NULL    | Y       | NULL    | 6       | -6      |
+---------+---------+---------+---------+---------+---------+---------+

谢谢。

您需要的是交叉连接:

SELECT Ref.Id, Oth.id, ......
FROM dbo.tbl AS Ref
CROSS JOIN dbo.tbl AS Oth
WHERE Ref.Id = 'B';
有关加入的更多信息,请查看我的博客系列:

此处描述了交叉连接:

这应该可以:

SELECT  A.ID1 [REF.ID1],
        A.ID1 [OTH.ID1],
        CASE WHEN A.ID2 = B.ID2 THEN A.ID2 ELSE NULL END [REF.ID2],
        B.ID2 [OTH.ID2],
        CASE WHEN A.ID2 = B.ID2 THEN A.VAL ELSE NULL END [REF.VAL],
        B.VAL [OTH.VAL],
        CASE WHEN A.ID2 = B.ID2 THEN A.VAL ELSE 0 END - B.VAL [DIFF]
FROM (  SELECT *
        FROM YourTable
        WHERE ID1 = 'B') A
CROSS JOIN YourTable B

我的问题是如何获得期望的输出。有什么可能不清楚?不知何故,我无法使用
交叉连接
提出有效的解决方案。你能用[这个]()找到答案吗?@danas.zuokas好的,我知道结果与你发布的结果不完全匹配。但是您想要的reuslt有一些不一致的地方,例如,我们如何知道带
ID1='B'
的哪一行需要与其他5行进行比较?没有明确的方法来执行您想要的联接