【问题标题】:SELECT statement with duplicate table names具有重复表名的 SELECT 语句
【发布时间】:2018-02-28 04:16:18
【问题描述】:

我有两个不同的功能 sql 语句需要组合。

尽量避免在 SELECT 语句中出现重复名称,同时仍在 SQL 查询中检索我要查找的数据。

第一个更长的查询:

Select USER.USER_NAME, ASSET.NAME AS KACE_ASSET_NAME, FIELD_31, V3.FIELD_VALUE AS CUSTOM_3, FIELD_20 AS BARCODE, FIELD_27 AS SERIAL_NUMBER

FROM ASSET
JOIN USER ON ASSET.OWNER_ID = USER.ID

JOIN ASSET_DATA_5 ON ASSET.ASSET_DATA_ID = ASSET_DATA_5.ID AND ASSET_TYPE_ID = 5


LEFT JOIN USER_FIELD_VALUE V3 ON V3.USER_ID = USER.ID AND V3.FIELD_ID = 3 

LEFT JOIN ASSET ASSET_LOCATION  ON ASSET_LOCATION.ID = ASSET.LOCATION_ID
LEFT JOIN ASSET_ASSOCIATION J21 ON J21.ASSET_ID = ASSET.ID AND J21.ASSET_FIELD_ID=21
LEFT JOIN ASSET A21 ON A21.ID = J21.ASSOCIATED_ASSET_ID
LEFT JOIN ASSET_DATA_1 AD21 ON AD21.ID = A21.ASSET_DATA_ID
WHERE V3.FIELD_VALUE = 'TERMINATED'

第二个较小的查询:

SELECT ASSET.NAME AS CITY 
FROM ASSET_DATA_1 LEFT JOIN ASSET ON ASSET_DATA_1.ID = ASSET.ASSET_DATA_ID AND ASSET.ASSET_TYPE_ID=1

我尽力将两者结合起来:

Select USER.USER_NAME, ASSET.NAME AS KACE_ASSET_NAME, FIELD_31, V3.FIELD_VALUE AS CUSTOM_3, FIELD_20 AS BARCODE, FIELD_27 AS SERIAL_NUMBER, ASSET.NAME as CITY

FROM ASSET
JOIN USER ON ASSET.OWNER_ID = USER.ID

JOIN ASSET_DATA_5 ON ASSET.ASSET_DATA_ID = ASSET_DATA_5.ID AND ASSET_TYPE_ID = 5


LEFT JOIN USER_FIELD_VALUE V3 ON V3.USER_ID = USER.ID AND V3.FIELD_ID = 3 

LEFT JOIN ASSET ASSET_LOCATION  ON ASSET_LOCATION.ID = ASSET.LOCATION_ID
LEFT JOIN ASSET_ASSOCIATION J21 ON J21.ASSET_ID = ASSET.ID AND J21.ASSET_FIELD_ID=21
LEFT JOIN ASSET A21 ON A21.ID = J21.ASSOCIATED_ASSET_ID
LEFT JOIN ASSET_DATA_1 AD21 ON AD21.ID = A21.ASSET_DATA_ID


#IMPORTANT JOIN HERE - NEED TO LINK THIS INFO BACK TO SELECT STATEMENT
LEFT JOIN ASSET ASSET_DATA_1 ON ASSET_DATA_1.ID = ASSET.ASSET_DATA_ID AND ASSET.ASSET_TYPE_ID=1  


WHERE V3.FIELD_VALUE = 'TERMINATED'

因此尝试构建此 SELECT 语句,以便将 assets.name 正确链接回此处列出的最后一个 LEFT JOIN。问题是有两个名为 ASSET.NAME 的列和两个 ASSET 表,我相信。我不确定如何在 SELECT 语句中调用“ASSET_DATA_1”表中的“ASSET.NAME”数据,而不仅仅是获取第一个 Asset 表的副本。 我四处寻找答案,并尝试了诸如括号中的 SELECT 语句和 UNION 命令之类的方法,但这些似乎都不是答案。 SQL noob 并对此感到有些不知所措。

【问题讨论】:

    标签: mysql select duplicates


    【解决方案1】:

    要删除重复项,请对所有选定的列使用 group by。

    SELECT USER.USER_NAME, ASSET.NAME AS KACE_ASSET_NAME, FIELD_31, V3.FIELD_VALUE AS CUSTOM_3, FIELD_20 AS BARCODE, FIELD_27 AS SERIAL_NUMBER
    FROM ASSET
    JOIN USER ON ASSET.OWNER_ID = USER.ID
    JOIN ASSET_DATA_5 ON ASSET.ASSET_DATA_ID = ASSET_DATA_5.ID AND ASSET_TYPE_ID = 5
    LEFT JOIN USER_FIELD_VALUE V3 ON V3.USER_ID = USER.ID AND V3.FIELD_ID = 3 
    LEFT JOIN ASSET ASSET_LOCATION  ON ASSET_LOCATION.ID = ASSET.LOCATION_ID
    LEFT JOIN ASSET_ASSOCIATION J21 ON J21.ASSET_ID = ASSET.ID AND J21.ASSET_FIELD_ID=21
    LEFT JOIN ASSET A21 ON A21.ID = J21.ASSOCIATED_ASSET_ID
    LEFT JOIN ASSET_DATA_1 AD21 ON AD21.ID = A21.ASSET_DATA_ID
    WHERE V3.FIELD_VALUE = 'TERMINATED'
    GROUP BY USER.USER_NAME, ASSET.NAME, FIELD_31, V3.FIELD_VALUE, FIELD_20, FIELD_27;
    

    【讨论】:

      【解决方案2】:

      如果你想删除重复的行,你应该使用 DISTINCT 子句

      Select DISTINCT 
      
          USER.USER_NAME, ASSET.NAME AS KACE_ASSET_NAME, FIELD_31,
           V3.FIELD_VALUE AS CUSTOM_3, FIELD_20 AS BARCODE, FIELD_27 AS SERIAL_NUMBER
      
      FROM ASSET
      JOIN USER ON ASSET.OWNER_ID = USER.ID
      
      JOIN ASSET_DATA_5 ON ASSET.ASSET_DATA_ID = ASSET_DATA_5.ID AND ASSET_TYPE_ID = 5
      
      
      LEFT JOIN USER_FIELD_VALUE V3 ON V3.USER_ID = USER.ID AND V3.FIELD_ID = 3 
      
      LEFT JOIN ASSET ASSET_LOCATION  ON ASSET_LOCATION.ID = ASSET.LOCATION_ID
      LEFT JOIN ASSET_ASSOCIATION J21 ON J21.ASSET_ID = ASSET.ID AND J21.ASSET_FIELD_ID=21
      LEFT JOIN ASSET A21 ON A21.ID = J21.ASSOCIATED_ASSET_ID
      LEFT JOIN ASSET_DATA_1 AD21 ON AD21.ID = A21.ASSET_DATA_ID
      WHERE V3.FIELD_VALUE = 'TERMINATED'
      

      (当你没有聚合函数时,在这个范围内使用 group by 在 sql 中已被弃用,并且在最新版本的 mysql 中是不允许的)

      【讨论】:

        【解决方案3】:

        您可以为资产表的第二个副本添加不同的别名:

        Select USER.USER_NAME, 
        ASSET.NAME AS KACE_ASSET_NAME, 
        FIELD_31, 
        V3.FIELD_VALUE AS CUSTOM_3, 
        FIELD_20 AS BARCODE, 
        FIELD_27 AS SERIAL_NUMBER,
         asset_again .NAME as CITY
        
        FROM ASSET
        JOIN USER ON ASSET.OWNER_ID = USER.ID
        
        JOIN ASSET_DATA_5 ON ASSET.ASSET_DATA_ID = ASSET_DATA_5.ID AND ASSET_TYPE_ID = 5
        
        
        LEFT JOIN USER_FIELD_VALUE V3 ON V3.USER_ID = USER.ID AND V3.FIELD_ID = 3 
        
        LEFT JOIN ASSET ASSET_LOCATION  ON ASSET_LOCATION.ID = ASSET.LOCATION_ID
        LEFT JOIN ASSET_ASSOCIATION J21 ON J21.ASSET_ID = ASSET.ID AND J21.ASSET_FIELD_ID=21
        LEFT JOIN ASSET A21 ON A21.ID = J21.ASSOCIATED_ASSET_ID
        LEFT JOIN ASSET_DATA_1 AD21 ON AD21.ID = A21.ASSET_DATA_ID
        
        
        #IMPORTANT JOIN HERE - NEED TO LINK THIS INFO BACK TO SELECT STATEMENT
        LEFT JOIN ASSET asset_again ON ad21 .ID = asset_again.ASSET_DATA_ID AND asset_again .ASSET_TYPE_ID=1  
        
        
        WHERE V3.FIELD_VALUE = 'TERMINATED'
        

        事实上,再次阅读这个问题,我看到你试图通过使用 ASSET_DATA_1 作为别名来混淆事情。使用唯一的(查询)别名并使用该别名来引用列列表中的表

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-21
          • 1970-01-01
          • 1970-01-01
          • 2013-06-30
          • 1970-01-01
          • 2015-05-14
          相关资源
          最近更新 更多