Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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_Oracle - Fatal编程技术网

Sql 如何使用多外键表为精确值编写此查询?

Sql 如何使用多外键表为精确值编写此查询?,sql,oracle,Sql,Oracle,我有三张桌子: table_1: id 1 2 table_2: id table2_order 1 1 2 1 2 2 table_3: id table2_order order code 1 1 1 52 1 1

我有三张桌子:

 table_1:

   id                 
   1       
   2

 table_2:

   id   table2_order
   1        1
   2        1
   2        2 

table_3:

 id     table2_order     order     code
 1          1              1        52   
 1          1              2        52
 2          1              1        69
 2          1              2        52
 2          2              1        01        
要以这种方式联接这些表,请执行以下操作:

SELECT * FROM table_1 t1
LEFT JOIN table_2 t2 ON t1.id = t2.id
LEFT JOIN table_3 t3 ON t2.id = t3.id AND t2.table2_order = t3.table2_order
WHERE t3.code = '52'
我怎样才能得到52而不是69的所有值? 他们正在搜索52的值。所以他们只需要代码为52的ID。 他们可以搜索一到多个代码。需要完全是代码而已。 这里我想得到id=1,但不是id=2,因为它只有69个。

只有52个

SELECT * FROM table_1 t1
LEFT JOIN table_2 t2 ON t1.id = t2.id
LEFT JOIN table_3 t3 ON t2.id = t3.id AND t2.table2_order = t3.table2_order and t3.code = '52'
LEFT JOIN table_3 no ON t2.id = no.id AND t2.table2_order = no.table2_order and no.code <> '52'
WHERE no.id is null
从表1 t1中选择*
t1.id=t2.id上的左联接表_2 t2
t2.id=t3.id和t2.table2上的左联接表_3 t3_顺序=t3.table2_顺序和t3.code='52'
t2.id=no.id和t2.table2上的左联接表_3编号顺序=no.table2编号顺序和编号代码“52”
其中no.id为空

这称为反连接。这意味着您只能获得具有
code=52而没有
code!=52

编辑后,看起来需要内部连接,而不是左连接。并检查
52
行数是否等于该ID的所有行数。但这并不清楚:他们可以搜索一对多代码。可能
在(52,53,54)中编码
?他想要有52的行,但没有其他行包含52^^^以外的值yea@Hogan-这很清楚。查询返回id=2和order=2的行。它没有代码=52。@dropkick——这是根据您给出的示例代码解决您的问题。假设您的代码是正确的,那么这将得到代码为52且只有52的项目。使用左联接,然后检查null将查找所有未联接的项——这允许您根据联接条件排除这些项。@APC如何才能生成更好的表结构?我希望下面的查询能够解释联接的假设方式。@Hogan table_3 order是该表的唯一标识符。我已更改了发布的代码,以便将
table_3
的两个实例联接到
table_2
。这修复了@dropkick抱怨的打字错误,我认为这也更能表达意图。@APC——我看到了您所做的更改——这不会改变功能(连接是关联的),但如果这样写的话,会更清楚:耸耸肩: