2017-11-10 75 views
0

我努力在SQL Server中做一些超级简单的事情。相当于MySQL的T-SQL与其他表格相似

我想从一个表中获取一些列(让我们只是为了简单起见),然后根据第一个表中的键计算另一个表的其他列,并在结果集中包含两个值。

下面的查询工作在MySQL,但并没有在SQL Server:

SELECT 
    ph.PONum, 
    COUNT(pd.POLine) AS LineCount 
FROM 
    POHeader AS ph 
INNER JOIN 
    PODetail AS pd ON ph.POnum = pd.PONum 
WHERE 
    ph.PONum = 4444 

结果:

enter image description here

什么是SQL服务器(T-SQL)的方式来做到这一点?

+0

MySQL不使用'[table_name]'表示法。 – tadman

+0

是的,我知道,但这不是这个问题的要点。 –

+0

嗯,我读它是因为你试图在MySQL端使用它。 – tadman

回答

3

与MySQL不同,SQL Server不会假设您想要分组的列。每个未汇总的列需要在GROUP BY列表中定义。

您所查询的应该是:

SELECT 
    ph.PONum, 
    COUNT(pd.POLine) AS LineCount 
FROM 
    [Dbo].POHeader AS ph 
INNER JOIN 
    [Dbo].PODetail AS pd ON ph.POnum = pd.PONum 
WHERE 
    ph.PONum = 4444 
GROUP BY 
    ph.PONum 
+1

所以如果我有20个领域,我抓住我必须做GROUP BY field1,field2,field3等?哇,那是不方便的 –

+0

不幸的是。 – varubi

+2

@ S.Mason这是SQL标准。除非你使用'SET SESSION sql_mode = CONCAT(@@ sql_mode,',only_full_group_by');否则MySQL使用GROUP BY遵循SQL标准,参见http:// www .sqlfiddle.com /#!9/ece0d7/5 –

1

你也可以使用一个相关子查询。 EG

SELECT 
    ph.PONum, 
    (select COUNT(*) from PODetail where PONum = ph.POnum) LineCount 
FROM 
    POHeader ph 
WHERE 
    ph.PONum = 4444 
+1

您的意思是一个相关的子查询 –

+0

您在技术上是正确的 - 最好的一种正确的。 –