繁体   English   中英

具有三向联接的SQL查询

[英]SQL Query with Three Way Join

我看到这里有一些关于三个表的SQL连接的不同线程。 我有一个不同的问题正在给我带来麻烦。 这可能是数据库设计问题,或者我没有正确使用联接?

基本上,我想从称为“事务”的表中获取所有内容,并从“事务”中的两个查找字段中联接两个查找表。 问题是查找表中可能并不总是存在查找结果。 这是我的数据库架构:

Transactions-主表我要从中获取数据

  • ID
  • 交易类型
  • Prop_ID
  • ...其他不相关的领域

属性 -查找表

  • ID
  • ...其他不相关的领域

Transaction_Type-查找表

  • ID
  • ..其他无关领域

这是我的查询:

SELECT * FROM `Transactions` 
Join TransactionType on Transactions.Type_ID = TransactionType.ID 
Join Property on Transactions.Prop_ID = Property.ID  
ORDER BY `Transactions`.`ID`  DESC

这给了我我想要的99%。 问题是,当Transactions.Prop_ID没有匹配的Property.ID时,它不会从Transaction表中返回记录。 我有一些Transactions的Prop_ID为0,这表示它们属于一般类别-与属性无关。

我的问题是我拥有与财产相关的所有这些交易。 除了某些内容适合整个企业(电话费,互联网等)。 我认为它们应该真正进入事务表,但是它们不会加入该查询中的属性。 同时,在Property表中添加常规记录似乎也很错误,因为这会破坏其他几项内容。

有什么建议吗? 我很早就可以更改架构,如果需要的话? 我希望在仍可以的情况下以正确的方式进行操作。 谢谢!

它可能不是最终的解决方案,但首先使用左联接

SELECT Transactions.*, 
  FROM `Transactions` 
  LEFT JOIN TransactionType on Transactions.Type_ID = TransactionType.ID 
  LEFT JOIN Property on Transactions.Prop_ID = Property.ID  
ORDER BY `Transactions`.`ID`  DESC

这样,在TransactionType表中Type_ID不匹配的事务将把TransactionType.ID显示为NULL,而不是完全不带任何内容。 属性表也是如此。 Property.ID中不匹配的行将显示为Property.ID NULL。

例如,这可以帮助您查找以前的查询由于属性或TransactionType中缺少匹配记录而遗漏的每个事务。

SELECT Transactions.*, 
  FROM `Transactions` 
  LEFT JOIN TransactionType on Transactions.Type_ID = TransactionType.ID 
  LEFT JOIN Property on Transactions.Prop_ID = Property.ID  
WHERE (Property.ID is null OR TransactionType.ID is NULL)
ORDER BY `Transactions`.`ID`  DESC

SQL中的三表JOIN语法:

SELECT t1.col,t3.col FROM table1 join table2 ON table1.primarykey = table2.foreignkey join table3 ON table2.primarykey = table3.foreignkey

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM