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——我看到了您所做的更改——这不会改变功能(连接是关联的),但如果这样写的话,会更清楚:耸耸肩: