【问题标题】:Select one table row to join to each row from another table选择一个表行以连接到另一个表中的每一行
【发布时间】:2019-05-06 15:03:10
【问题描述】:

我有两张表,Departments 和 Accounts。例如:

部门

+--------+--------+
|Company |DptCode  |
+--------+--------+
|SND     |CD41     |
+--------+--------+
|SND     |CD42     |
+--------+--------+

帐户

+--------+--------+
|Company |AcctCode |
+--------+--------+
|SND     |ACT      |
+--------+--------+
|SND     |BBS      |
+--------+--------+
|SND     |DIP      |
+--------+--------+

我正在尝试编写一个查询来选择每个加入的部门以从 Accounts 表中获取所有帐户代码,就像这样

+--------+--------+
|DptCode |AcctCode|
+--------+--------+
|CD41    |ACT     |
+--------+--------+
|CD41    |BBS     |
+--------+--------+
|CD41    |DIP     |
+--------+--------+
|CD42    |ACT     |
+--------+--------+
|CD42    |BBS     |
+--------+--------+
|CD42    |DIP     |
+--------+--------+

如果我需要对它们进行分组,我无法弄清楚如何对它们进行分组,我不知道如何进行此加入。当我运行以下查询时,我得到了许多重复的行。

SELECT  d.Company, d.DptCode, a.AcctCode
FROM Departments d
JOIN Accounts a ON d.Company = a.Company

【问题讨论】:

  • 您的join逻辑实际上是正确的,但是您的select子句略有偏差。您发布的查询甚至不会运行。使用正确的列名,查询应该可以工作。
  • @TimBiegeleisen 我的错,当我从我的 sql-server 复制并粘贴到这里时,这是一个拼写错误。
  • 那么这里的问题是什么?我使用 SQL Server 2014 创建了表和您的数据,您的查询产生了您想要的输出。

标签: sql sql-server tsql


【解决方案1】:

使用连接

;WITH CTE_dept(Company ,DptCode  )
AS
(
SELECT 'SND','CD41' UNION ALL    
SELECT 'SND','CD42'  
),CTe_Accounts(Company ,AcctCode )
AS
(
SELECT 'SND','ACT' UNION ALL     
SELECT 'SND','BBS' UNION ALL      
SELECT 'SND','DIP'      
)
SELECT cd.DptCode,
        ca.AcctCode
FROM CTE_dept cd
INNER JOIN CTe_Accounts ca
    ON  ca.Company = cd.Company

结果

DptCode  AcctCode
-----------------
CD41     ACT
CD41     BBS
CD41     DIP
CD42     ACT
CD42     BBS
CD42     DIP

【讨论】:

  • 我认为这里不需要左连接。为什么不使用内连接?
  • 这是按原样工作的,但我需要从指定的 2 个表中进行选择,而不是将值硬编码到 CTE 中。
  • @Truecolor 这里的 cte 是替换表格,因为在您的帖子中没有可以使用的表格。在您的代码中,您可以将选择更改为从表中提取,而不是从 ctes 中提取。
【解决方案2】:

我认为你需要CROSS JOIN

SELECT DISTINCT d.DptCode, a.AcctCode
FROM Departments d CROSS JOIN
     Accounts a; 

【讨论】:

  • Ummm....交叉连接没有 ON 子句。交叉连接是笛卡尔坐标,所以 ON 子句没有意义。
  • @SeanLange 但是,需要注意的是,在某些 SQL 版本中,没有 ON 子句的 INNER JOIN 实际上是 CROSS JOIN ^ ^
  • @TimBiegeleisen 嗯?我认为您的意思是 ANSI-89 样式的联接(又名逗号分隔的表列表)?这是一个交叉连接,然后使用 where 谓词进行过滤。我不知道您可以指定显式内部联接但不使用联接谓词的任何版本。
  • @SeanLange 在 MySQL 中当然是可能的(我认为是 SQLite)。虽然不确定 SQL Server :-)
  • @Tim 真的吗?这太可怕了。似乎这是他们引擎上的一个大洞。没有谓词的内连接不应该是交叉连接。它应该产生语法错误。很容易忘记你的连接谓词并得到一个可怕的错误结果。但无论如何,每个 DBMS 都有一些严重的怪癖需要处理。
猜你喜欢
  • 2012-06-28
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
  • 2016-06-30
  • 2017-02-23
  • 2011-02-22
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多