【问题标题】:SQL INNER JOIN tables with different row names具有不同行名的 SQL INNER JOIN 表
【发布时间】:2019-06-08 04:45:27
【问题描述】:

感谢您花时间阅读本文,这可能是一个非常基本的问题。对于INNER JOIN 运算符,我所做的大多数搜索查询似乎都更深入一些。

基本上我的问题是这样的:我有一张发货和收货表,上面有物品的发货或收货日期。在运输表 (tbl_shipping) 中,日期行被标记为 trans_out_date,而对于接收表 (tbl_receiving),日期行被标记为 trans_in_date

我可以从用户输入的表单中查看在任一表上设置的事务,但我想使用从满足条件的两个表中提取的信息填充一个表。 IE。如果接收表在 4 月完成了 10 笔交易,在 6 月完成了 5 笔交易,而发货表在 4 月完成了 15 笔交易,在 6 月完成了 10 笔交易……当用户想要查看 6 月的所有交易时,它将填充发生在 6 月的 15 笔交易六月。

截至目前,我只能从 1 张桌子中拉出

SELECT * 
FROM tbl_shipping 
WHERE trans_out_date >= ‘from_date’ 
  AND trans_out_date <= ‘to_date’

这对于我想要实现的目标来说是合适的语法吗?

SELECT * 
FROM tbl_shipping 
INNER JOIN tbl_receiving ON tbl_shipping.trans_out_date = tbl_receiving.trans_in_date 
WHERE 
    tbl_shipping.trans_out_date >= ‘from_date’ 
    AND tbl_shipping.trans_out_date <= ‘to_date’

再次感谢您阅读本文。

【问题讨论】:

  • 你想要一个 UNION——来自 2 个表中的任何一个的行——当它在一个或另一个时返回一行。 JOIN 在一个中有子行并且在另一个中有子行时返回一个行对。您对所需行的描述不要求返回的行在两个表中都有列(可能是全部),但在任何一个中都有。 Is there any rule of thumb to construct SQL query from a human-readable description?
  • 你为什么不试试这段代码?请在代码问题中给出minimal reproducible example--cut & paste & runnable code;具有期望和实际输出的示例输入(包括逐字错误消息);标签和明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)

标签: sql inner-join where


【解决方案1】:

您似乎想要union all 而不是join

SELECT s.item, s.trans_out_date as dte, 'shipped' as which
FROM tbl_shipping S
WHERE s.trans_out_date >= ? AND 
      s.trans_out_date <= ?
UNION ALL
SELECT r.item, NULL, r.trans_in_date as dte, 'received'
FROM tbl_receiving r
WHERE r.trans_out_date >= ? AND 
      r.trans_out_date <= ?
ORDER BY dte;

注意事项:

  • JOIN 可能会因数据丢失(因为日期不对齐)或数据重复(因为有多个日期)而导致问题。
  • ? 用于参数。如果您从应用程序调用它,请使用参数!
  • 您可以在结果集中包含其他列以获取更多信息。

这可能不是您想要的确切结果格式。如果不是,请使用示例数据和所需结果提出另一个问题。

【讨论】:

    猜你喜欢
    • 2014-12-23
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多