假设我有两个表PO
和PO_Line
,我想列出PO
中的所有字段以及PO_Line
中链接回每行的所有字段数量PO
我会写一个类似于
SELECT
PO.propA,
PO.propB,
PO.propC,
PO.propD,
PO.propE,
...
PO.propY,
COUNT(PO_Line.propA) LINES
FROM
PO
LEFT JOIN
PO_Lines
ON
PO.ID = PO_Lines.PO_ID
显然,这会产生一些错误 -
列'PO.propA'在选择列表中是invaalid,因为它不包含在聚合函数或GROUP BY子句中。
因此,为了让查询运行,我将在查询末尾添加一个GROUP BY
子句,并复制并粘贴我的选择行,如下所示 -
SELECT
PO.propA,
PO.propB,
PO.propC,
PO.propD,
PO.propE,
...
PO.propY,
COUNT(PO_Line.propA) LINES
FROM
PO
LEFT JOIN
PO_Lines
ON
PO.ID = PO_Lines.PO_ID
GROUP BY
PO.propA,
PO.propB,
PO.propC,
PO.propD,
PO.propE,
...
PO.propY
哪个效果很好然而这一切都感觉有点笨拙,特别是如果我已经命名我的列,即 -
SELECT
PO.propA AS 'FIRST PROPERTY',
PO.propB AS 'SECOND PROPERTY',
PO.propC AS 'THIRD PROPERTY',
PO.propD AS 'ANOTHER PROPERTY',
PO.propE AS 'YOU GET THE IDEA',
...
PO.propY
我必须复制/粘贴select子句中的条目,然后删除列名。
所以我的问题是 - 是否有一种速记方法可以通过select子句中的所有非聚合条目来表示组?
答案 0 :(得分:2)
我认为你只想要窗口功能:
SELECT . . .,
COUNT(PO_Line.propA) OVER (PARTITION BY PO.ID) as LINES
FROM PO LEFT JOIN
PO_Lines
ON PO.ID = PO_Lines.PO_ID;
答案 1 :(得分:1)
我必须复制/粘贴select子句中的条目,然后删除列名。
我强烈建议您使用block/column selection。将,
作为第一个元素移动并对齐别名:
SELECT
PO.propA AS 'FIRST PROPERTY'
,PO.propB AS 'SECOND PROPERTY'
,PO.propC AS 'THIRD PROPERTY'
,PO.propD AS 'ANOTHER PROPERTY'
,PO.propE AS 'YOU GET THE IDEA'
...
,PO.propY
,COUNT(PO_Line.propA) LINES
FROM PO
LEFT JOIN PO_Lines
ON PO.ID = PO_Lines.PO_ID
GROUP BY
...
在SQL Server Management Studio
中使用简单块选择 SHIFT + ALT 突出显示并粘贴。
如果您正在使用其他编辑器,请找到相应的keyshortcut here。
如同添加架构,别名等等,可以立即进行多次编辑。
答案 2 :(得分:1)
阅读您的查询我认为您可能不需要GROUP BY
开头:
SELECT
PO.propA,
PO.propB,
PO.propC,
PO.propD,
PO.propE,
...
PO.propY,
(SELECT COUNT(*) FROM PO_Lines WHERE PO.ID = PO_Lines.PO_ID) LINES
FROM
PO