SQL查询新手寻找一些方向

时间:2015-02-06 02:29:25

标签: sql sql-server sql-server-2008

我是SQL新手,我正在开展一个项目,我在这个项目中查询来自数据库各个表的数据。查询信息的关键组件是一系列许可ID。这些ID是12个字母数字,如果是新许可,则以0结尾;如果是修订许可,则以1-9结束(前11个数字仍然与修订的初始许可ID相匹配)。此外,如果取消许可证,则会在ID上附加第13个字符" C"。我在伪SQL中的基本查询看起来像这样:

SELECT Permit_ID,
[other related data, things like permit holder name, issue date, etc.]
...
FROM Premit_Table
inner Join [other appropriate tables]
WHERE Permit_ID is not null
ORDER BY Permit_ID

在此查询之后,我将有一个数据表,如下所示:

    Initial Permit_ID     [Other Data]  ......

    XXXXXXXXXXX0               - 

    YYYYYYYYYYY0               -

    YYYYYYYYYYY1               -

    YYYYYYYYYYY2               -

    ZZZZZZZZZZZ0C              -

    ZZZZZZZZZZZ1C              -

我想要做的是更改我的查询,将一些修订后的许可证信息与他们从中获得的初始许可证组合在一起。我希望最终产品看起来像这样:

    Initial Permit_ID        [Initial Permit_ID Data]......   Revised Permit_ID      [Select Revised Permit_ID Data] ......
    XXXXXXXXXXX0                        -                         [No Data]                      [No Data]
    YYYYYYYYYYY0                        -                        YYYYYYYYYYY1                        -
    YYYYYYYYYYY0                        -                        YYYYYYYYYYY2                        -
    ZZZZZZZZZZZ0C                       -                       ZZZZZZZZZZZ1C                        -

最后两列是我想要为我的决赛桌制作的。在此设置中,我希望显示初始ID以及任何其他数据,如果对许可证有任何修订,我想显示新ID以及一些选择信息(已更改的内容,例如重新发布日期)在同一行。如果已经进行了多个修订,我希望每个修订版有一行,并在所有行上显示初始ID数据。同样的模型适用于任何已取消的许可(由" C"表示)。

到目前为止,我几乎没有接触过SQL,而且我对如何重构查询以产生预期结果感到有点迷失。我希望被指向正确的方向。

1 个答案:

答案 0 :(得分:0)

首先将初始许可与修订后的许可分开。然后你可以做LEFT JOIN

CREATE TABLE Permit_Table(Permit_ID VARCHAR(13))
INSERT INTO Permit_Table VALUES
('XXXXXXXXXXX0'), ('YYYYYYYYYYY0'), ('YYYYYYYYYYY1'),
('YYYYYYYYYYY2'), ('ZZZZZZZZZZZ0C'), ('ZZZZZZZZZZZ1C');

;WITH Initial AS( -- Inital Permit_ID ends with 0 or 0C
    SELECT *
    FROM Permit_Table
    WHERE 
        Permit_ID LIKE '%0'
        OR Permit_ID LIKE '%0C'
)
,Revised AS( -- Revised Permit_ID ends with [1-9] or [1-9]C
    SELECT 
        *,
        Inital_Permit_ID = -- Get the initial Permit_ID using some string manipulation
            CASE
                WHEN RIGHT(Permit_ID, 1) LIKE '%[1-9]' THEN SUBSTRING(Permit_ID, 1, 11) + '0'
                WHEN RIGHT(Permit_ID, 1) = 'C' THEN SUBSTRING(Permit_ID, 1, 11) + '0C'
            END
    FROM Permit_Table
    WHERE 
        Permit_ID LIKE '%[1-9]'
        OR Permit_ID LIKE '%[1-9]C'
)
SELECT
    [Initial Permit_ID] = i.Permit_ID,
    [Revised Permit_ID] = r.Permit_ID
FROM Initial i
LEFT JOIN Revised r
    ON i.Permit_ID = r.Inital_Permit_ID

DROP TABLE Permit_Table

<强> RESULT

Initial Permit_ID Revised Permit_ID
----------------- -----------------
XXXXXXXXXXX0      NULL
YYYYYYYYYYY0      YYYYYYYYYYY1
YYYYYYYYYYY0      YYYYYYYYYYY2
ZZZZZZZZZZZ0C     ZZZZZZZZZZZ1C