【问题标题】:Dual results in Query查询中的双重结果
【发布时间】:2021-12-22 11:13:10
【问题描述】:

我有一个查询,我的订单项中的结果翻了一番。这是我所拥有的副本。我必须以不同的方式进行连接吗?这也是结果的屏幕截图。每个订单项都加倍。

SELECT 
  ds_id as "TMP", 
  ds_ship_date as "Ship Date", 
  ds_ref1_text as "Container Number", 
  o.co_name as "Origin", 
  o.co_city as "Origin City", 
  o.co_state as "Origin State", 
  de_arrdate as "Deliver Date", 
  de_arrtime as "Arrival Time", 
  de_deptime as "Departure Time", 
  ds_bill_charge as "TMP Total Charges",
  (CASE ds_ship_type WHEN '2201' THEN 'MONTREAL'
    WHEN '2202' THEN 'DRYVAN'
    WHEN '2203' THEN 'BROKERAGE'
    WHEN '2204' THEN 'OLD BROKERAGE'
    WHEN '2205' THEN 'LIFTING'
    WHEN '2206' THEN 'WAREHOUSE'
  END) AS "Division",
  dba.disp_items.di_qty,
  dba.disp_items.RateCodename 
FROM dba.disp_ship 
  JOIN dba.disp_events ON de_shipment_id = ds_id 
  JOIN dba.disp_items ON DBA.disp_items.di_shipment_id = dba.disp_ship.ds_id
  JOIN dba.companies o ON o.co_id = ds_origin_id 
WHERE de_site = ds_findest_id 
  AND TMP = '70189'
ORDER BY ratecodename desc  

【问题讨论】:

  • 如果您可以更新查询以在所有列引用上包含表名前缀(至少对于join/where/group by 子句),这将有所帮助;在这一点上,我无法判断重复行是否可能是缺少连接子句的问题(即笛卡尔积的结果); o 更详细的级别可能需要检查这些表和相关联的连接子句之间的关系(例如,每个连接子句匹配多少行)
  • 对我来说这看起来如下:disp_shipdisp_eventsdisp_items。您选择了两者,尽管它们没有直接关系(一个事件不属于一个项目,一个项目不属于一个事件)。如果一艘船有两个事件和两个项目,则您为该船选择 2 x 2 = 4 行,每个事件与每个项目相结合。你不想要这个,所以决定你想要什么。您可以 SELECT DISTINCT 删除任何重复项,但您可能更希望进行一些聚合,例如总项目数量而不是单个数量或最新事件而不是所有事件。

标签: sql sybase sqlanywhere isql


【解决方案1】:

只需使用 GROUP BY。试试这样:

SELECT      ds_id AS TMP, ds_ship_date AS ShipDate, ds_ref1_text AS ContainerNumber, o.co_name AS Origin, o.co_city AS OriginCity, o.co_state AS OriginState, de_arrdate AS DeliverDate, de_arrtime AS ArrivalTime, de_deptime AS DepartureTime, 
            ds_bill_charge AS TMPTotalCharges,
            CASE ds_ship_type
                    WHEN '2201' THEN 'MONTREAL'
                    WHEN '2202' THEN 'DRYVAN'
                    WHEN '2203' THEN 'BROKERAGE'
                    WHEN '2204' THEN 'OLD BROKERAGE'
                    WHEN '2205' THEN 'LIFTING'
                    WHEN '2206' THEN 'WAREHOUSE'
            END
            AS Division,
            dba.disp_items.di_qty, dba.disp_items.RateCodename 

FROM        dba.disp_ship
JOIN        dba.disp_events ON de_shipment_id = ds_id
JOIN        dba.disp_items ON DBA.disp_items.di_shipment_id = dba.disp_ship.ds_id
JOIN        dba.companies o ON o.co_id = ds_origin_id
WHERE       de_site = ds_findest_id
AND         TMP = '70189'
GROUP BY    TMP, ShipDate, ContainerNumber, Origin, OriginCity, OriginState, DeliverDate, ArrivalTime, DepartureTime, TMPTotalCharges, Division, di_qty, RateCodename
ORDER BY    ratecodename DESC

【讨论】:

  • 这里的SELECT DISTINCT 会更典型。但DISTINCT 通常表示查询编写不当。重复项的存在是有原因的(可能是事件和项目的笛卡尔连接)。所以最好仔细考虑一下并决定真正想要什么(每艘船的某个事件?每艘船的某个物品?聚合,比如每艘船的总物品数量?)话虽如此,我认为这个答案不好建议。
猜你喜欢
  • 1970-01-01
  • 2013-09-26
  • 2019-05-17
  • 2015-11-08
  • 2011-06-30
  • 1970-01-01
  • 2023-03-18
  • 2019-10-21
  • 2014-12-30
相关资源
最近更新 更多