Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL使用特定条件连接两个表_Sql_Select_Join_Left Join_Where Clause - Fatal编程技术网

SQL使用特定条件连接两个表

SQL使用特定条件连接两个表,sql,select,join,left-join,where-clause,Sql,Select,Join,Left Join,Where Clause,表A结构: 表B结构: 上面是两个表,TableB.TableARelationID是用于映射表a的关系ID 期望输出: 期望的结果是采用TableA.RecordID和TableB.Text,但仅采用表B中的类型2,即忽略类型1 下面是我使用的SQL查询: SELECT tablea.recordid, tableb.text FROM tablea LEFT JOIN tableb ON tablea.relation

表A结构:

表B结构:

上面是两个表,TableB.TableARelationID是用于映射表a的关系ID

期望输出:

期望的结果是采用TableA.RecordID和TableB.Text,但仅采用表B中的类型2,即忽略类型1

下面是我使用的SQL查询:

SELECT tablea.recordid, 
       tableb.text 
FROM   tablea 
       LEFT JOIN tableb 
              ON tablea.relationid = tableb.tablearelationid 
WHERE  type = 2 
但上述查询将输出:

i、 e.由于过滤了“where”子句,RecordID 1丢失


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

您需要将
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
然后在type列上进行筛选,因此对于recordID=1,您的where
NULL=2
为false(它实际上不是false,它是NULL,但它不是true),因此此记录将从最终结果中删除


无论何时离开join,都必须在join条件(而不是where)中将任何要应用于左表的筛选条件应用于左表,否则将有效地将其转化为内部联接。

如果使用
where
语句进行筛选,则联接将被视为
内部联接

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

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

您应该使用
TableB.Type=2

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

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

试试这个:

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

此查询有两个直接版本

SELECT recordid, CASE WHEN type=2 THEN text ELSE NULL END text
FROM tableA
JOIN tableB
  ON tableA.relationid = tableB.tablearelationid;
这将为类型2显示NULL,并且不包括两个表中不存在的行

SELECT recordid, text
FROM tableA
LEFT JOIN tableB
  ON tableA.relationid = tableB.tablearelationid AND type=2;
这将执行相同的操作,但包括仅以NULL形式存在于TableA中的行

.

试试看

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