【发布时间】: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_ship有disp_events和disp_items。您选择了两者,尽管它们没有直接关系(一个事件不属于一个项目,一个项目不属于一个事件)。如果一艘船有两个事件和两个项目,则您为该船选择 2 x 2 = 4 行,每个事件与每个项目相结合。你不想要这个,所以决定你想要什么。您可以SELECT DISTINCT删除任何重复项,但您可能更希望进行一些聚合,例如总项目数量而不是单个数量或最新事件而不是所有事件。
标签: sql sybase sqlanywhere isql