SQL连接具有特定条件的两个表

时间:2013-12-30 09:17:37

标签: sql select join left-join where-clause

表A结构:

enter image description here

表B结构:

enter image description here

上面是两个表,TableB.TableARelationID是一个用于映射表A的relationID。

期望的输出:

enter image description here

所需的结果将是TableA.RecordID和TableB.Text,但只有表B中的Type 2,即忽略Type 1

以下是我使用的SQL查询:

SELECT tablea.recordid, 
       tableb.text 
FROM   tablea 
       LEFT JOIN tableb 
              ON tablea.relationid = tableb.tablearelationid 
WHERE  type = 2 

但上面的查询会输出:

enter image description here

即。由于过滤了“where”子句,因此缺少RecordID 1。

那么如何从表A中显示RecordID 1?

7 个答案:

答案 0 :(得分:5)

您需要将type = 2过滤器移动到连接条件:

SELECT  TableA.RecordID, TableB.Text 
FROM    TableA 
        LEFT JOIN TableB 
            ON TableA.RelationID = TableB.TableARelationID 
            AND TableB.Type = 2;

考虑这个结果:

SELECT  TableA.RecordID, TableB.Text, TableB.Type
FROM    TableA 
        LEFT JOIN TableB 
            ON TableA.RelationID = TableB.TableARelationID;

你会得到

RecordID | Text | Type
  1      | NULL | NULL
  2      |   B  |  2
  3      |   C  |  2
  4      |   D  |  2

然后你在类型列上进行过滤,所以对于recordID = 1,你有NULL = 2哪个是假的(它实际上不是假的,它是null,但它不是真的),所以这个记录是从最终结果中消除。

每当您离开加入时,您必须在连接条件中应用您希望应用于左表的任何过滤条件而不是在哪里,否则您实际上将其转换为内连接。

答案 1 :(得分:1)

如果您使用Where语句进行过滤,则该联接将被视为inner join

select 
   TableA.RecordID
   , TableB.Text 
from 
   TableA 
   left join TableB on TableA.RelationID = TableB.TableARelationID AND TableB.Type = 2

答案 2 :(得分:1)

试试这个

select TableA.RecordID, TableB.Text 
from TableA 
left join TableB on 
  TableA.RelationID = TableB.TableARelationID AND 
  TableB.Type = 2

答案 3 :(得分:1)

您应该使用TableB.Type = 2

  select TableA.RecordID, TableB.Text 
    from    TableA, 
             TableB 
                where TableA.RelationID = TableB.TableARelationID 
                and TableB.Type = 2

答案 4 :(得分:1)

Type = 2条件中添加LEFT JOIN条件。

试试这个:

SELECT A.RecordID, B.Text 
FROM TableA A 
LEFT JOIN TableB B ON A.RelationID = B.TableARelationID AND B.Type = 2

答案 5 :(得分:1)

此查询有两个直接版本;

SELECT recordid, CASE WHEN type=2 THEN text ELSE NULL END text
FROM tableA
JOIN tableB
  ON tableA.relationid = tableB.tablearelationid;

这将显示类型<>的NULL 2并且不包括两个表中都不存在的行。

SELECT recordid, text
FROM tableA
LEFT JOIN tableB
  ON tableA.relationid = tableB.tablearelationid AND type=2;

这会做同样的事情,但包含只在TableA中存在的行为NULL。

An SQLfiddle to test both and see the difference

答案 6 :(得分:1)

尝试

SELECT tA.RecordID, tB.Text 
FROM [TableA] AS tA
LEFT JOIN [TableB] AS tB
 ON tA.RelationID = tB.TableARelationID 
 AND tB.Type = 2