2011-08-02 32 views
0

我不是SQL大师,无论如何,我很难包装我的头如何做一个特定的SQL查询。需要帮助设计一个SQL语句

我有三个Oracle数据库表,MBRHISTDETL,LOCINFODETL和METERCHGDETL。从MBRHISTDETL我会得到以下字段:MBRSEP,LOCATION,BILLTYPE,BILLMOYR,KWH。从LOCINFODETL(LOCATION是关键)我会得到DIST,CYCLE,ADDR1。从METERCHGDETL(MBRSEP是关键)我会得到METER。

到目前为止,使用我的查询,我能够从MBRHISTDETL和LOCINFODETL获取所需的所有信息。但是,我现在不太清楚如何将下一个表METERCHRDETL添加到查询语句中。有人可以帮我解决这个问题吗?

这里是我的查询,到目前为止:

SELECT LOCINFODETL.LOCATION AS L.LOCATION, 
    LOCINFODETL.DIST, LOCINFODETL.CYCLE, 
    LOCINFODETL.ADDR1, MBRHISTDETL.MBRSEP, 
    MBRHISTDETL.LOCATION AS M.LOCATION, 
    MBRHISTDETL.BILLTYPE, MBRHISTDETL.BILLMOYR, 
    MBRHISTDETL.KWH 
FROM MBRHISTDETL 
    INNER JOIN L.LOCINFODETL ON H.MBRHISTDETL.LOCATION = L.LOCATION 
WHERE MBRHISTDETL.BILLTYPE = '09' 
    AND CAV_MBRHISTDETL.BILLMOYR <> '9999' 
    AND SUBSTR(LOCINFODETL.CYCLE,0,2) = '04' 
    AND LOCINFODETL.DIST = '16' 
+1

Oracle有“表”而不是“文件” – APC

+0

对不起,APC。我是一位老的AS/400程序员,我们总是把数据库表称为“文件”。我不知道为什么,因为“表格”是正确的术语。 – Kevin

回答

3

这应该让你开始 - 但你需要知道哪个字段链接你的M表。

另外 - 只是一个样式提示 - 如果你第一次尝试从SQL中理解特别是 - 你将能够证明你的SQL更容易,如果你格式化一点点vertcially。我的风格可能并不是最好的,但是你可以看看它是否让事情变得更容易阅读。

SELECT 
    L.LOCATION AS L_LOCATION, 
    L.DIST, 
    L.CYCLE, 
    L.ADDR1, 
    H.MBRSEP, 
    H.LOCATION AS H_LOCATION, 
    H.BILLTYPE, 
    H.BILLMOYR, 
    H.KWH, 
    M.METER 
FROM 
     MBRHISTDETL H 
    INNER JOIN 
     LOCINFODETL L 
    ON 
     H.LOCATION = L.LOCATION 
    INNER JOIN 
     METERCHRDETL M 
    ON M.___KEY___ = H.___KEY___ -- or perhaps L.___KEY___ 
WHERE 
     H.BILLTYPE = '09' 
    AND H.BILLMOYR <> '9999' 
    AND SUBSTR(L.CYCLE,0,2) = '04' 
    AND L.DIST = '16' 
0

像这样的事情应该工作,虽然我不是你正在使用的前缀的100%。

SELECT LOCINFODETL.LOCATION AS L.LOCATION, 
    LOCINFODETL.DIST, LOCINFODETL.CYCLE, 
    LOCINFODETL.ADDR1, MBRHISTDETL.MBRSEP, 
    MBRHISTDETL.LOCATION AS M.LOCATION, 
    MBRHISTDETL.BILLTYPE, MBRHISTDETL.BILLMOYR, 
    MBRHISTDETL.KWH, METERCHGDETL.METER 
FROM MBRHISTDETL 
    INNER JOIN L.LOCINFODETL ON H.MBRHISTDETL.LOCATION = L.LOCATION 
    INNER JOIN METERCHGDETL ON H.MBRHISTDETL.MBRSEP = METERCHGDETL.MBRSEP 
WHERE MBRHISTDETL.BILLTYPE = '09' 
    AND CAV_MBRHISTDETL.BILLMOYR <> '9999' 
    AND SUBSTR(LOCINFODETL.CYCLE,0,2) = '04' 
    AND LOCINFODETL.DIST = '16'