意外的内部联接行为

时间:2017-05-10 08:50:58

标签: sql-server left-join

我有一个问题:

select  TABLE.NAME,
  max(case when TABLE_ADDITION.CODE= 1 then TABLE_ADDITION.VALUE end) Mach1,
  max(case when TABLE_ADDITION.CODE= 4 then TABLE_ADDITION.VALUE end) Source,
  max(case when TABLE_ADDITION.CODE= 6 then TABLE_ADDITION.VALUE end) Dest,
  max(case when TABLE_ADDITION.CODE= 16 then TABLE_ADDITION.VALUE end) Mach2
 FROM TABLE

这是有效的,结果是:

NAME     Mach1      Source       Dest      Mach2
test     11         testS        testD     12

我需要来自另一个表(MACH)的其他信息。列Mach1和mach2是ID。我想使用此ID从正确的表MACH中取名(请参阅下面的数据 - 帖子的结尾)。

我希望:

NAME     Mach1          Source       Dest      Mach2
test     machName11     testS        testD     machName12

为此,我做了:

   select  TABLE.NAME,
      max(case when TABLE_ADDITION.CODE= 1 then MACH.MACHNAME end) Mach1,
      max(case when TABLE_ADDITION.CODE= 4 then TABLE_ADDITION.VALUE end) Source,
      max(case when TABLE_ADDITION.CODE= 6 then TABLE_ADDITION.VALUE end) Dest,
      max(case when TABLE_ADDITION.CODE= 16 then MACH.MACHNAME end) Mach2
     FROM TABLE
     INNER JOIN TABLE_ADDITION ON TABLE.TABLEID = TABLE_ADDITION.TABLEID AND TABLE.NAME = TABLE_ADDITION.NAME
     INNER JOIN MACH ON TABLE_ADDITION.CODE IN (1, 16) AND TABLE_ADDITION .VALUE = MACH.MACHID

但是,我没有收到预期的行为:

NAME     Mach1          Source       Dest      Mach2
test     machName11     NULL         NULL      machName12

我尝试过LEFT JOIN和INNER JOIN。

TABLE_ADDITION的数据:

TABLEID       NAME    CODE     VALUE
1             test    1        11
1             test    4        testS
1             test    6        testD
1             test    16       12
1             test    20       value11
1             test    25       45
1             test    ... [continue with a lot of ID and VALUE are int or varchar]
2             test2    1        45
2             test2    4        testSource\test
2             test2    6        testDest\test
2             test2    16       1
2             test2    20       value
2             test2    25       76
[continue for other ID]

对于MACH

MACHID    MACHNAME    MACHTYPE
0         test        0
3         test1       1
10        test3       2
11        machName11  2
12        machName12  2
[continue with other ID]

For TABLE

TABLEID    NAME   TABLETYPE
1          test   12
1          test3  12
2          name   5
[continue with other ID]

我需要TABLE,因为它是我的主表(带有其他列),我选择其中一些没有问题。

编辑,我编辑我的帖子,这是错误的,缺少太多的数据来理解我的问题。

现在它正在运行,因为我添加了一个联接:

   select  TABLE.NAME,
      max(case when t2.CODE= 1 then MACH.MACHNAME end) Mach1,
      max(case when TABLE_ADDITION.CODE= 4 then TABLE_ADDITION.VALUE end) Source,
      max(case when TABLE_ADDITION.CODE= 6 then TABLE_ADDITION.VALUE end) Dest,
      max(case when t2.CODE= 16 then MACH.MACHNAME end) Mach2
     FROM TABLE
     INNER JOIN TABLE_ADDITION ON TABLE.TABLEID = TABLE_ADDITION.TABLEID AND TABLE.NAME = TABLE_ADDITION.NAME
     INNER JOIN TABLE_ADDITION t2 ON TABLE.TABLEID = t2 .TABLEID AND TABLE.NAME = t2 .NAME
     INNER JOIN MACH ON t2 .CODE IN (1, 16) AND t2 .VALUE = MACH.MACHID

由于

0 个答案:

没有答案