2011-06-07 50 views
0

有一个关于SQL和ColdFusion的问题:我无法正确编写SQL代码,因此它不会重复两次变量。到目前为止,我已经有了:更改sql代码以消除重复

<cfquery name="get_partner_all" datasource="#dsn#"> 
    SELECT 
    C.COMPANY_ID, 
    C.FULLNAME, 
    CP.MOBILTEL, 
    CP.MOBIL_CODE, 
    CP.IMCAT_ID, 
    CP.COMPANY_PARTNER_TEL, 
    CP.COMPANY_PARTNER_TELCODE, 
    CP.COMPANY_PARTNER_TEL_EXT, 
    CP.MISSION, 
    CP.DEPARTMENT, 
    CP.TITLE, 
    CP.COMPANY_PARTNER_SURNAME, 
    CP.COMPANY_PARTNER_NAME, 
    CP.PARTNER_ID, 
    CP.COMPANY_PARTNER_EMAIL, 
    CP.HOMEPAGE, 
    CP.COUNTY, 
    CP.COUNTRY, 
    CP.COMPANY_PARTNER_ADDRESS, 
    CP.COMPANY_PARTNER_FAX, 
    CC.COMPANYCAT, 
    CRM.BAKIYE, 
    CRM.BORC, 
    CRM.ALACAK 
    FROM 
     COMPANY_PARTNER CP, 
     COMPANY C, 
     COMPANY_CAT CC, 
     #DSN2_ALIAS#.COMPANY_REMAINDER_MONEY CRM 
    WHERE 
       C.COMPANY_ID = CP.COMPANY_ID 
    AND C.COMPANY_ID = CRM.COMPANY_ID 
    AND C.COMPANYCAT_ID = CC.COMPANYCAT_ID 

正如你所看到的定义C.COMPANY_ID重复两次,所以也显示两次变量,但我需要这个(CRM)的定义显示一些钱的问题。

任何人都可以告诉我如何以不同的方式定义它,以便此代码的输出不会重复变量?

+0

不知道表的模式涉及到它很难回应这个,但你的意思是你得到重复c.company_id行或该列显示了两次? – Maverik 2011-06-07 09:09:47

+0

即时获得重复的行,而不是列,我修改了选择部分,但仍然没有改变 – user775917 2011-06-07 09:36:27

+0

我已经更新了我的答案,并提供了一些关于下一步看什么的提示。 – 2011-06-07 09:46:00

回答

2

我假设你的意思是你在结果集中得到了多个列,每个列的名字都是“COMPANY_ID”。解决方法是从所有表中指定特定列,而不是SELECT *(不仅仅是COMPANY_CAT表,别名CC)。


如果您得到“重复”行,那么您需要检查这些行的内容。发生的情况是,另一个表中的一行或多行与“COMPANY”表中的一行匹配。每对匹配的行在输出中生成一行。现在,您已经扩展了列列表,比较了一对具有相同的行的行 - 列中它们有哪些不同?如果它位于最后3列中,则CRM中有多个行匹配相同的COMPANY_ID

一旦确定了导致重复出现的其他表格,您需要决定如何限制它们 - 如果您要汇总该表格中的值(例如SUMMAX),还是有办法进一步请细化要与其他表格中的哪一行匹配到COMPANY中的行。

在猜测,虽然,我推测,一个公司可以有多个合作伙伴...

0

不要使用select table.*。相反,请明确列出每列并不重复列,如下所示:

select 
    c.company_id, 
    c.blah_blah, 
    -- don't select cp.company_id 
    cp.foo_bar, 
    -- etc 
0

您只需删除*并用列名称列表替换即可。作为性能的角度来看,总是建议写列列表而不是*。另外,如果要在数据库表中添加任何列并使用*有时获取数据,则由于缓存而不会反映查询结果中的新列。

在你的情况下,只保留任何一个表的company_id。而已。