参照完整性和复杂的连接

时间:2016-09-21 15:36:45

标签: sql sql-server

A27,346467413,68723601
A28,346467414,68723601
A28,346467416,68723601
A27,349454768,8908697809
A28,349454769,8908697809
A28,349454771,8908697809

我从表中得到了上面的示例,我需要做一些令人难以置信的sql on。基本上我被问到的是,对于每一架A27,两架A28都属于那架A27而且这些信息需要捆绑在一起。但是,我被要求为每个A_Number创建一个表,因此A27将在其自己的表中,而A28将在其自己的表中。我需要做的就是加入它们,这样每个A27都可以链接到它后面的相应A28。只是想知道如果它在单独的表中以及Join和SQL会是什么样子我会怎么做?请记住,没有数据作为发票对帐的内容有任何意义。

enter image description here

我已上传附带的示例文件

enter image description here

2 个答案:

答案 0 :(得分:1)

鉴于缺少格式化输出,最佳猜测......

  • 我使用CTE(公用表表达式)作为数据集,并使用cte生成每组的行号。
  • 我使用左连接,因为我不知道是否总会有3行。
  • 我假设col3是每个组/分区的唯一标识符。
  • 我认为A27的col2值总是最低。
  • 我使用Row_number为每个分区的行编号

WITH dataset as (
SELECT 'A27' as Col1,346467413 as col2,68723601 as col3 UNION ALL
SELECT 'A28' as Col1,346467414 as col2,68723601 as col3 UNION ALL
SELECT 'A28' as Col1,346467416 as col2,68723601 as col3 UNION ALL
SELECT 'A27' as Col1,349454768 as col2,8908697809 as col3 UNION ALL
SELECT 'A28' as Col1,349454769 as col2,8908697809 as col3 UNION ALL
SELECT 'A28' as Col1,349454771 as col2,8908697809 as col3),

CTE AS 
(SELECT col1, col2, col3, row_number() over (partition by col3 order by col2) rn
FROM dataset)

SELECT A.Col1, A.Col3, A.Col2, B.Col2 as, C.Col2 
FROM cte A
LEFT JOIN cte B
 on A.Col3 = B.Col3 and A.Rn= 1 and b.rn = 2
LEFT JOIn cte C
 on A.Col3 = C.Col3 and A.RN =1 and c.RN = 3

这应该会产生平坦的输出,然后可以根据需要将其放入单独的表中。

答案 1 :(得分:1)

Invite invite = new Invite();

ObjectWriter.Set(invite, "State_Invite_Recipient_Id", "outlook", delimiter: "_");

因为基于您的图片,;WITH cte AS ( SELECT * ,ROW_NUMBER() OVER (ORDER BY Column2) AS RowNumber FROM @Table ) SELECT * ,DENSE_RANK() OVER (ORDER BY A27.Column2) as GroupingId FROM cte A27 LEFT JOIN cte A28 ON A28.RowNumber IN (a27.RowNumber + 1, a27.RowNumber + 2) AND A28.Column1 = 'A28' WHERE A27.Column1 = 'A27' 并不仅仅是您想要的行号所独有的,所以我没有使用它的路线。相反,我使用基于Column3的{​​{1}},它似乎是一个增量主键,然后只是ROW_NUMBER。这是针对每个A27行的2个A28行Column2。如果您想要“LEFT SELF JOIN”,就像您的OP所说但不建议那么只需通过更改AFTER条件来反转它:

preceding

注意我添加了一个JOIN,以便您确定哪些A27和A28在一起它可以用作A27表中的新主键和A28表中的外键保持这种关系。

这是我使用的测试数据。

ON A28.RowNumber IN (a27.RowNumber - 1, a27.RowNumber - 2)

编辑:根据您在单独的表格中如何执行此操作的注释。您可以使用union all来组合表:

GroupingID

如果表格较大或性能可能有问题,您可能需要构建临时表并按此方式执行。

DECLARE @Table AS TABLE (Column1 CHAR(3), Column2 BIGINT, Column3 BIGINT)
INSERT INTO @Table VALUES
('A27',346467408,68723601)
,('A28',346467409,68723601)
,('A28',346467411,68723601)
,('A27',346467413,68723601)
,('A28',346467414,68723601)
,('A28',346467416,68723601)
,('A27',349454768,8908697809)
,('A28',349454769,8908697809)
,('A28',349454771,8908697809)