根据合并的表号获取新坐标

时间:2014-08-01 10:26:48

标签: sql sql-server

有两张桌子。一个是包含'表信息'的基表。对于游客中心。另一个包含'职业信息'。

基表结构具有为每个表记录的原始坐标(x,y)。但是在职业期间,一两个表可以与另一个表合并。在这种情况下,我希望获得具有新坐标的不同表格列表。无法更改或更新基表坐标。

不知怎的,我只是没有得到结果。您可能会注意到表7和9已合并。将7合并为9.因此9是主表,表7和9必须具有9的坐标。

TABLE_NUMBER    T_TABLE     TABLE_TYPE  LOCATION_X  LOCATION_Y
1                (null)     Rectangular     49      74
2                (null)     Rectangular     68      101
3                3          Rectangular     49      107
4                4          Rectangular     24      80
5                (null)     Rectangular     82      80
6                6          Round           29      19
7                (null)     Round           13      9
8                8          Round           66      10
9                9          Round           112     16
9                7          Round           112     16

预期结果:

TABLE_NUMBER    TABLE_TYPE    LOCATION_X    LOCATION_Y
 1               Rectangular    49           74
 2               Rectangular    68           101
 3               Rectangular    49           107
 4               Rectangular    24           80
 5               Rectangular    82           80
 6               Round          29           19
 7               Round          112          16
 8               Round          66           10
 9               Round          112          16

这里是sql fiddle for reference

1 个答案:

答案 0 :(得分:0)

希望这有效。 Fiddle Attached

<强>脚本:

;WITH cte_temp AS
(
  SELECT TT.TABLE_NUMBER
      ,TC.TABLE_NUMBER T_TABLE
      ,TT.[TABLE_TYPE]
      ,TT.[LOCATION_X]
      ,TT.[LOCATION_Y]      
  FROM [TABLES] TT LEFT JOIN [OCCUPATIONS] TC
  ON (TT.[TABLE_NUMBER] = CASE WHEN TC.[MAIN_TABLE_NUMBER] = 0 THEN TC.TABLE_NUMBER
  ELSE TC.MAIN_TABLE_NUMBER END)
)

SELECT DISTINCT 
      a.TABLE_NUMBER,
      a.TABLE_TYPE,
      CASE WHEN a.T_TABLE IS NULL AND b.T_TABLE IS NOT NULL THEN b.LOCATION_X ELSE a.LOCATION_X END AS LOCATION_X,
      CASE WHEN a.T_TABLE IS NULL AND b.T_TABLE IS NOT NULL THEN b.LOCATION_Y ELSE a.LOCATION_Y END AS LOCATION_Y
FROM cte_temp AS a
LEFT OUTER JOIN cte_temp AS b
    ON a.TABLE_NUMBER = b.T_TABLE