我正在尝试解决SQL Server错误。有人可以帮帮我吗?
查询是:
SELECT TOP 10 *
FROM (
SELECT c.id, c.name, c.inserteddate, c.cityname, ftblstates.name AS statename, clc.name AS catname, '' AS listingimagelogo, '' AS orgname, relocateyn, '' AS employerclassified
FROM ((tblclassifieds c
LEFT JOIN tblclassifiedscategories clc ON c.categoryid = clc.id)
LEFT JOIN ftblstates ON c.stateid = ftblstates.id)
WHERE (c.expirydate != '') AND NOT c.id IN (
SELECT TOP 10 tblclassifieds.id
FROM tblclassifieds
WHERE (c.expirydate != '')
ORDER BY inserteddate desc)
UNION ALL
SELECT ce.id, ce.name, ce.inserteddate, suburb AS cityname, ftblstates.name AS statename, ce.jobtype AS catname, ce.listingimagelogo, ce.orgname, '' AS relocateyn, '1' AS employerclassified
FROM tblclassifiedemployers ce
LEFT JOIN ftblstates ON ce.stateid = ftblstates.id
WHERE (ce.expirydate != '') AND NOT ce.id IN (
SELECT TOP 10 tblclassifiedemployers.id
FROM tblclassifiedemployers
WHERE (ce.expirydate != '')
ORDER BY inserteddate desc)
ORDER BY inserteddate desc;
错误:除非还指定了TOP或FOR XML,否则ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效。
答案 0 :(得分:4)
如上所述,除非使用TOP或FOR XML,否则ORDER BY不得出现在子查询中。
SELECT TOP 10 * FROM (
SELECT
c.id,
c.name,
c.inserteddate,
c.cityname,
ftblstates.name AS statename,
clc.name AS catname,
'' AS listingimagelogo,
'' AS orgname, relocateyn,
'' AS employerclassified
FROM tblclassifieds c
LEFT JOIN tblclassifiedscategories clc ON c.categoryid = clc.id
LEFT JOIN ftblstates ON c.stateid = ftblstates.id
WHERE c.expirydate != ''
AND NOT c.id IN (
SELECT TOP 10
tblclassifieds.id
FROM tblclassifieds
WHERE c.expirydate != ''
ORDER BY inserteddate desc
)
UNION ALL
SELECT
ce.id,
ce.name,
ce.inserteddate,
suburb AS cityname,
ftblstates.name AS statename,
ce.jobtype AS catname,
ce.listingimagelogo,
ce.orgname, '' AS relocateyn,
'1' AS employerclassified
FROM tblclassifiedemployers ce
LEFT JOIN ftblstates ON ce.stateid = ftblstates.id
WHERE ce.expirydate != ''
AND NOT ce.id IN (
SELECT TOP 10
tblclassifiedemployers.id
FROM tblclassifiedemployers
WHERE ce.expirydate != ''
ORDER BY inserteddate desc
)
) a ORDER BY inserteddate desc;
答案 1 :(得分:1)
如果您使用的是SQL Server 2012或更高版本,请在订购后使用“偏移0行”。 例如-
create view Department_View
as
select Name from [HumanResources].[Department]
order by Name offset 0 rows
答案 2 :(得分:0)
我认为这是不言自明的。您不能在子查询中使用ORDER BY子句,因为它们不使用TOP或FOR XML。
在审核您的代码时,我不确定我是否看到了问题代码。所有代码看起来都是正确的。您只在使用TOP命令的子查询中使用ORDER BY,因此它们应该全部工作。我会注释掉所有ORDER BY命令,然后一次添加一个,直到找到引发错误的命令。也许它不喜欢它们,因为它们是子查询的子查询。
编辑:再看一遍,我认为问题是你的IN语句。当您使用IN时,我不相信您可以使用ORDER BY进行子查询。
以下是我要尝试的代码:
SELECT TOP 10 *
FROM (
SELECT c.id, c.name, c.inserteddate, c.cityname, ftblstates.name AS statename, clc.name AS catname, '' AS listingimagelogo, '' AS orgname, relocateyn, '' AS employerclassified
FROM ((tblclassifieds c
LEFT JOIN tblclassifiedscategories clc ON c.categoryid = clc.id)
LEFT JOIN ftblstates ON c.stateid = ftblstates.id)
WHERE (c.expirydate != '') AND NOT c.id IN (
SELECT TOP 10 tblclassifieds.id
FROM tblclassifieds
WHERE (c.expirydate != ''))
UNION ALL
SELECT ce.id, ce.name, ce.inserteddate, suburb AS cityname, ftblstates.name AS statename, ce.jobtype AS catname, ce.listingimagelogo, ce.orgname, '' AS relocateyn, '1' AS employerclassified
FROM tblclassifiedemployers ce
LEFT JOIN ftblstates ON ce.stateid = ftblstates.id
WHERE (ce.expirydate != '') AND NOT ce.id IN (
SELECT TOP 10 tblclassifiedemployers.id
FROM tblclassifiedemployers
WHERE (ce.expirydate != '')))
答案 3 :(得分:0)
我使用了以下结构:
SELECT
ROW_NUMBER() OVER (ORDER BY LASTNAME) SORTORDER,
*
FROM
CLIENT
答案 4 :(得分:0)
使用这个:
create view Department_View
as
select Name from [HumanResources].[Department]
order by Name offset 0 rows
答案 5 :(得分:-1)
CREATE FUNCTION GetUnitIDWithScenarioCount
(
@calculatorType int
)
returns TABLE as
return
(
select count,unitid from(
SELECT Top 1
count(sc.UnitId) as count, sc.unitid
FROM scenarios SC
INNER JOIN npcstatus NPC
ON NPC.UnitId=SC.UnitId
INNER JOIN IPEDSCollegeData..hd hd
ON hd.UnitId=NPC.UnitId
WHERE npc.calculatorType=4
Group by sc.unitid
) as temp
order by count
)