简体   繁体   English

SQL联合按内部查询然后按整个联合选择顺序

[英]SQL Union Select Order by inner query then by entire union

I have created a SQL UNION string that looks like this and works (the {dData} and similar placeholders are filled in by VB.Net code): 我创建了一个看起来像这样的SQL UNION字符串,并且可以正常工作( {dData}和类似的占位符由VB.Net代码填充):

SELECT LEFT({dData}.PLATE,7) AS Plates, 
    {dData}.SIGHTING_DT AS LPRReadDate, 
    {dLov}.LOCATION AS LPRLocation 
FROM {dData} 
INNER JOIN {dLov} ON ({dData}.ROAD_NAME = {dLov}.ROAD_NAME) AND ({dData}.READER = {dLov}.READER) 
WHERE ({dData}.SIGHTING_DT >= @sdate AND {dData}.SIGHTING_DT <= @edate) 
    AND (LEN(COALESCE({dData}.PLATE,'')) = @slen1 OR LEN(COALESCE({dData}.PLATE,'')) = @slen2) 
    AND {dData}.PLATE NOT LIKE @rx1 
    AND {dData}.PLATE = @pf 
UNION 
SELECT LEFT({vData}.PLATE,7) AS Plates, 
    {vData}.SIGHTING_DT AS LPRReadDate, 
    {vLov}.LOCATION AS LPRLocation 
FROM {vData} 
INNER JOIN {vLov} ON {vData}.CAMERA = {vLov}.CAMERA 
WHERE ({vData}.SIGHTING_DT >= @sdate AND {vData}.SIGHTING_DT <= @edate) 
    AND (LEN(COALESCE({vData}.PLATE,'')) = @slen1 OR LEN(COALESCE({vData}.PLATE,'')) = @slen2) 
    AND {vData}.PLATE NOT LIKE @rx1 
    AND {vData}.PLATE = @pf 
ORDER BY LPRReadDate

The problem is I need to get the Top 1 and Order the second Select statement by LPRRead Date in Descending Order. 问题是我需要获得前1名,并按LPRRead Date降序对第二条Select语句进行排序。 I tried doing it like this. 我试图这样做。

SELECT LEFT({dData}.PLATE,7) AS Plates, 
    {dData}.SIGHTING_DT AS LPRReadDate, 
    {dLov}.LOCATION AS LPRLocation 
FROM {dData} 
INNER JOIN {dLov} ON ({dData}.ROAD_NAME = {dLov}.ROAD_NAME) AND ({dData}.READER = {dLov}.READER) 
WHERE ({dData}.SIGHTING_DT >= @sdate AND {dData}.SIGHTING_DT <= @edate) 
    AND (LEN(COALESCE({dData}.PLATE,'')) = @slen1 OR LEN(COALESCE({dData}.PLATE,'')) = @slen2) 
    AND {dData}.PLATE NOT LIKE @rx1 
    AND {dData}.PLATE = @pf 
UNION 
(SELECT TOP 1 LEFT({vData}.PLATE,7) AS Plates, 
    {vData}.SIGHTING_DT AS LPRReadDate, 
    {vLov}.LOCATION AS LPRLocation 
FROM {vData} 
INNER JOIN {vLov} ON {vData}.CAMERA = {vLov}.CAMERA 
WHERE ({vData}.SIGHTING_DT >= @sdate AND {vData}.SIGHTING_DT <= @edate) 
    AND (LEN(COALESCE({vData}.PLATE,'')) = @slen1 OR LEN(COALESCE({vData}.PLATE,'')) = @slen2) 
    AND {vData}.PLATE NOT LIKE @rx1 
    AND {vData}.PLATE = @pf 
ORDER BY {vLov}.CREATED_DT DESC)  
ORDER BY LPRReadDate

But, I am getting this error: 但是,我收到此错误:

Syntax Error near 'ORDER'. 'ORDER'附近的语法错误。

I am sure that I need to do some kind of sub-query. 我确定我需要进行某种子查询。 I've tried to figure it out by looking at examples online, but I can't figure it out. 我试图通过在网上查看示例来弄清楚,但我无法弄清楚。

Update @UnhandledExcepSean I tried adapting what you said to my code. 更新 @UnhandledExcepSean我尝试使您所说的内容适应我的代码。 After a couple more syntax errors, I arrived at the code below. 在发生了另外几个语法错误之后,我到达了下面的代码。 But whenever I try to run it, it just times out the server. 但是,每当我尝试运行它时,它只会使服务器超时。 Can you tell me if it looks correct or if there are any changes that might need to be made.... 您能告诉我它看起来是否正确,或者是否需要进行任何更改。...

SELECT 
  Plates, LPRReadDate, LPRLocation 
FROM(
    SELECT TOP 1 
        LEFT({vData}.PLATE,7) AS Plates, {vData}.SIGHTING_DT AS LPRReadDate, {vLov}.LOCATION AS LPRLocation 
    FROM {vData} 
    INNER JOIN {vLov} ON {vData}.CAMERA = {vLov}.CAMERA 
    WHERE ({vData}.SIGHTING_DT >= @sdate AND {vData}.SIGHTING_DT <= @edate) 
        AND (LEN(COALESCE({vData}.PLATE,'')) = @slen1 OR LEN(COALESCE({vData}.PLATE,'')) = @slen2) 
        AND {vData}.PLATE NOT LIKE @rx1 
        AND {vData}.PLATE = @pf 
    ORDER BY {vLov}.CREATED_DT DESC
    ) test 
UNION
SELECT LEFT({EOCdata}.PLATE,7) AS Plates, 
    {EOCdata}.SIGHTING_DT AS LPRReadDate, 
    {EOClov}.LOCATION AS LPRLocation 
FROM {EOCdata} 
INNER JOIN {EOClov} ON ({EOCdata}.CAMERA = {EOClov}.CAMERA) AND ({EOCdata}.READER = {EOClov}.READER) 
WHERE ({EOCdata}.SIGHTING_DT >= @sdate AND {EOCdata}.SIGHTING_DT <= @edate) 
    AND (LEN(COALESCE({EOCdata}.PLATE,'')) = @slen1 OR LEN(COALESCE({EOCdata}.PLATE,'')) = @slen2) 
    AND {EOCdata}.PLATE NOT LIKE @rx1 
    AND {EOCdata}.PLATE = @pf 
ORDER BY LPRReadDate

You can work around the issue thusly: 您可以这样解决该问题:

DECLARE @t TABLE ( Field1 INT,Field2 INT)
INSERT INTO @t (Field1,Field2) SELECT 1,1
INSERT INTO @t (Field1,Field2) SELECT 2,2
INSERT INTO @t (Field1,Field2) SELECT 3,3

SELECT
    Field1,Field2
FROM(
    SELECT TOP 1
        Field1,Field2
    FROM @t
    ORDER BY Field1 ASC
) test
UNION
SELECT
    Field1,Field2
FROM @t
ORDER BY Field2 DESC

Thanks for the help everyone. 感谢大家的帮助。 I was finally able to work out how to do it. 我终于能够找到解决方法。 In case anyone might find it useful, I'll post what I came up with below. 万一有人觉得有用,我将在下面发布我提出的内容。 The derivedTable portion is that part that I was trying to figure out. 派生表部分是我试图弄清楚的那部分。

        WITH derivedTable 
        AS 
        (
            SELECT {vLov}.LPR_VIGILANT_LOV_ID, 
            {vLov}.CAMERA, 
            {vLov}.LOCATION, 
            {vLov}.CREATED_DT, 
            ROW_NUMBER() OVER (Partition By {vLov}.CAMERA 
                                ORDER BY {vLov}.CREATED_DT DESC) rn 
            FROM {vLov}
        ) 
        SELECT LEFT({vData}.PLATE,7) AS Plates, 
        {vData}.SIGHTING_DT AS LPRReadDate,          
        derivedTable.LOCATION 
        FROM {vData} 
        INNER JOIN derivedTable ON {vData}.CAMERA = derivedTable.CAMERA 
        WHERE ({vData}.SIGHTING_DT >= @sdate AND {vData}.SIGHTING_DT <= @edate) 
        AND (LEN(COALESCE({vData}.PLATE,'')) = @slen1 OR LEN(COALESCE({vData}.PLATE,'')) = @slen2) 
        AND {vData}.PLATE NOT LIKE @rx1 
        AND {vData}.LOCATION = @lf 
        AND derivedTable.rn = 1 
        UNION 
        SELECT LEFT({EOCdata}.PLATE,7) AS Plates, 
            {EOCdata}.SIGHTING_DT AS LPRReadDate, 
            {EOClov}.LOCATION AS LPRLocation 
        FROM {EOCdata} 
        INNER JOIN {EOClov} ON ({EOCdata}.CAMERA = {EOClov}.CAMERA) AND ({EOCdata}.READER = {EOClov}.READER) 
        WHERE ({EOCdata}.SIGHTING_DT >= @sdate AND {EOCdata}.SIGHTING_DT <= @edate) 
        AND (LEN(COALESCE({EOCdata}.PLATE,'')) = @slen1 OR LEN(COALESCE({EOCdata}.PLATE,'')) = @slen2) 
        AND {EOCdata}.PLATE NOT LIKE @rx1 
        AND {EOCdata}.LOCATION = @lf 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM