用于组合表的 SQL 语法

Posted

技术标签:

【中文标题】用于组合表的 SQL 语法【英文标题】:SQL Syntax to Combine Tables 【发布时间】:2013-10-04 19:06:34 【问题描述】:

我有三个 MS Access 表。它们是Income_StatementsBalance_SheetsCash_Flow_Statements。这些表都共享相同的主键。它是一个三字段主键,包括Ticker[Year]Period。我想在不复制主键字段的情况下组合所有这三个表。我也有一个需要满足的日期标准。我需要显示的记录等于或早于我从名为dtpDateSelectionDateTimePicker 中选择的日期。

这是我目前所拥有的:

Dim year As String = dtpDateSelection.Value.Year
Dim quarter As String = ((dtpDateSelection.Value.Month - 1) \ 3) + 1

Dim cmd2 As OleDbCommand = New OleDbCommand("SELECT Ticker, [Year], Period, Income_Statements.Net_Income, Balance_Sheets.Total_Assets, Cash_Flow_Statements.Net_Cash_Flow_Operating FROM Income_Statements, Balance_Sheets, Cash_Flow_Statements WHERE Period < 5 AND Period <= #" & quarter & "# AND [Year] <= #" & year & "#", con)
Dim quarterlyReader As OleDbDataReader = cmd2.ExecuteReader()
Dim Quarterly As New DataTable

Quarterly.Load(quarterlyReader)
DataGridViewScreen.DataSource = Quarterly
quarterlyReader.Close()

我的WHERE 语句有问题。我怎样才能做到这一点?

【问题讨论】:

很难知道你在做什么而不看你是如何解析 DateTimePicker 的。但看起来您可能缺少一两个 JOIN。 我可以做这样的事情吗:"SELECT * FROM Income_Statements, Balance_Sheets, Cash_Flow_Statements WHERE Period &lt; 5 AND Period &lt;= #" &amp; quarter &amp; "# AND [Year] &lt;= #" &amp; year &amp; "#" 在某处使用JOIN 声明? 您需要一个JOIN(即“组合”)并使用这些主键。见玲儿的回答 【参考方案1】:

如何将表格连接在一起并指定所需的字段:

SELECT i.Ticker, i.[Year], i.Period, i.Net_Income, 
   b.Total_Assets, c.Net_Cash_Flow_Operating 
FROM (Income_Statements AS i 
   INNER JOIN Balance_Sheets AS b 
   ON (i.Ticker = b.Ticker) AND (i.[Year] = b.[Year]) AND (i.Period = b.Period)) 
   INNER JOIN Cash_Flow_Statements AS c 
   ON (b.Ticker = c.Ticker) AND (b.[Year] = c.[Year]) AND (b.Period = c.Period)
WHERE i.Period <= #" & quarter & "# 
   AND i.[Year] <= #" & year & "#"

【讨论】:

效果很好!无论如何要在其中加入 *(从表中选择字段)? 你可以合并任何你想要的字段,如果你想从三个表中提取每个字段,你可以使用SELECT i.*, b.*, c.* 这正是我所需要的。再次感谢!【参考方案2】:

您的 WHERE 子句以两种方式处理 Period 列 - 作为一个整数和作为一个日期(这是哈希符号所暗示的),它不能同时是。

【讨论】:

太好了!这清除了第一条错误消息。我得到的另一个是The specified field 'Ticker' could refer to more than one table listed in the FROM clause of your SQL statement. 我该如何解决这个问题? 你至少需要指定哪个表 你需要在它前面加上一个表名来解决歧义,所以 Income_Statements.Ticker 应该可以工作。

以上是关于用于组合表的 SQL 语法的主要内容,如果未能解决你的问题,请参考以下文章

如何在pl/sql中获取表的三列的组合?

需要帮助编写组合两个表的 SQL SELECT 语句

创建一个组合两个表的视图 ms sql server 2014

组合来自 2 个单独的 SQL 表的列数据

如何编写组合多个表的Oracle Sql Query

在sql中组合来自不同表的数据