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行进行比较?没有明确的方法来执行您想要的联接