0

我正在使用此查询来查找网络上根据其服务标签具有过期保修的所有机器(使用戴尔 kace)。

但是,当我运行查询时,有些机器会列出两次,但应该只列出一次。

这是一个输出示例,其中机器示例 3 正确列出,但示例 1 列出了两次。

#      Machine Name     Service Tag

1       example1           abcd123

2       example1           abcd123

3       example3            abcd124

代码:

SELECT     

M.NAME AS MACHINE_NAME, M.CS_MODEL AS MODEL, DA.SERVICE_TAG,
DA.SHIP_DATE,M.USER_LOGGED AS LAST_LOGGED_IN_USER, DW.SERVICE_LEVEL_CODE,
DW.SERVICE_LEVEL_DESCRIPTION, DW.END_DATE AS EXPIRATION_DATE

FROM

DELL_WARRANTY DW

JOIN

DELL_ASSET DA ON (DW.SERVICE_TAG = DA.SERVICE_TAG)

JOIN

MACHINE M

ON (M.BIOS_SERIAL_NUMBER = DA.PARENT_SERVICE_TAG OR M.BIOS_SERIAL_NUMBER = DA.SERVICE_TAG)

LEFT JOIN

DELL_WARRANTY DW2 ON DW2.SERVICE_TAG=DW.SERVICE_TAG and DW2.END_DATE > NOW()

WHERE

M.CS_MANUFACTURER LIKE '%dell%'

AND

M.BIOS_SERIAL_NUMBER!=''

AND

 DA.DISABLED != 1

AND

DW.END_DATE < NOW()

AND

DW2.SERVICE_TAG IS NULL;

关于如何使具有相同机器名称和服务标签的计算机只输出一次的任何想法?谢谢。

4

2 回答 2

1

让我假设您有一个合理的数据模型和合理填充的数据。这意味着重复不是来自存储在数据库中的不适当数据。

您的查询(格式化以便我可以阅读)是:

SELECT M.NAME AS MACHINE_NAME, M.CS_MODEL AS MODEL, DA.SERVICE_TAG,
       DA.SHIP_DATE, M.USER_LOGGED AS LAST_LOGGED_IN_USER, DW.SERVICE_LEVEL_CODE,
       DW.SERVICE_LEVEL_DESCRIPTION, DW.END_DATE AS EXPIRATION_DATE
FROM DELL_WARRANTY DW JOIN
     DELL_ASSET DA
     ON DW.SERVICE_TAG = DA.SERVICE_TAG JOIN
     MACHINE M
     ON M.BIOS_SERIAL_NUMBER = DA.PARENT_SERVICE_TAG OR
        M.BIOS_SERIAL_NUMBER = DA.SERVICE_TAG LEFT JOIN
     DELL_WARRANTY DW2
     ON DW2.SERVICE_TAG = DW.SERVICE_TAG and DW2.END_DATE > NOW()
WHERE M.CS_MANUFACTURER LIKE '%dell%' AND
      M.BIOS_SERIAL_NUMBER <> '' AND
      DA.DISABLED <> 1;

嫌疑人join是那个,Machine因为它有一个or。因此,两台机器可能会匹配服务标签的不同部分,从而产生多个非常相似的行。

如果您特别关注机器名称和服务标签(您在问题中突出显示的两列),那么您可以通过结束查询来修复这些重复项:

group by M.NAME, DA.SERVICE_TAG

(这假设您使用的是 MySQL —— 基于查询的语法。大多数其他数据库需要围绕 中的其余列的聚合函数select。)

于 2013-09-10T20:55:36.477 回答
0

尝试在 M.Name 前面放置一个 DISTINCT

或者玩像这样的连接

 SELECT     

M.NAME AS MACHINE_NAME, M.CS_MODEL AS MODEL, DA.SERVICE_TAG,
DA.SHIP_DATE,M.USER_LOGGED AS LAST_LOGGED_IN_USER, DW.SERVICE_LEVEL_CODE,
DW.SERVICE_LEVEL_DESCRIPTION, DW.END_DATE AS EXPIRATION_DATE

FROM

DELL_WARRANTY DW

INNER JOIN

DELL_ASSET DA ON (DW.SERVICE_TAG = DA.SERVICE_TAG)

INNER JOIN

 MACHINE M

ON (M.BIOS_SERIAL_NUMBER = DA.PARENT_SERVICE_TAG OR M.BIOS_SERIAL_NUMBER = DA.SERVICE_TAG)

INNER JOIN

DELL_WARRANTY DW2 ON DW2.SERVICE_TAG=DW.SERVICE_TAG and DW2.END_DATE > NOW()

 WHERE

M.CS_MANUFACTURER LIKE '%dell%'

AND

M.BIOS_SERIAL_NUMBER!=''

AND

DA.DISABLED != 1

AND

DW.END_DATE < NOW()

AND

DW2.SERVICE_TAG IS NULL;
于 2013-09-10T19:09:36.277 回答