Postgresql 为什么在此查询中添加distinct不会产生重复的行?

Postgresql 为什么在此查询中添加distinct不会产生重复的行?,postgresql,Postgresql,此查询取自Rails应用程序日志…我正在尝试编辑一个我没有编写的大型postgresql语句…如果我没有在SELECT之后添加一个不同的关键字,每个braintree帐户将显示两个重复的行。为什么会这样?有没有其他方法可以避免使用distinct来避免重复 编辑:我理解distinct应该做什么,我问的原因是它不会为其他玩具生产线生成副本。通过其他玩具行,此查询正在为特定玩具id(此特定示例toys.id=12)构建一个“表”。如何确定在何处生成重复行 SELECT accounts.

此查询取自Rails应用程序日志…我正在尝试编辑一个我没有编写的大型postgresql语句…如果我没有在SELECT之后添加一个不同的关键字,每个braintree帐户将显示两个重复的行。为什么会这样?有没有其他方法可以避免使用distinct来避免重复

编辑:我理解distinct应该做什么,我问的原因是它不会为其他玩具生产线生成副本。通过其他玩具行,此查询正在为特定玩具id(此特定示例toys.id=12)构建一个“表”。如何确定在何处生成重复行

     SELECT accounts.braintree_account_id as braintree_account_id, 
                                    accounts.braintree_account_id as braintree_account_id, format('%s %s', addresses.first_name, 
                                addresses.last_name) as shipping_address_full_name, 
                            users.email as email, addresses.line_1 as shipping_address_line_1, 
                            addresses.line_2 as shipping_address_line_2, addresses.city as 
                            shipping_address_city, addresses.state as shipping_address_state,

                                    addresses.zip as shipping_address_zip_code, addresses.country
                         as shipping_address_country, CASE WHEN xy_shirt IS NULL THEN '' ELSE xy_shirt END, plans.name as plan_name, toys.sku as sku, to_char(accounts.created_at, 'MM/DD/YYYY HH24:MM:SS') as 
                        account_created_at, 
                    to_char(accounts.next_assessment_at, 'MM/DD/YYYY HH24:MM:SS') as account_next_assessment_at, 
                        accounts.account_status as account_status FROM \"accounts\" INNER JOIN \"addresses\" ON 
                                    \"addresses\".\"id\" = \"accounts\".\"shipping_address_id\" AND \"addresses\".\"type\" IN 
                    ('ShippingAddress') LEFT OUTER JOIN shipping_methods ON 
                    shipping_methods.account_id = accounts.id LEFT OUTER JOIN plans ON 

accounts.plan_id = plans.id 
LEFT OUTER JOIN users ON                          
accounts.user_id = users.id LEFT OUTER JOIN toys ON plans.toy_id = toys.id 
LEFT OUTER JOIN account_variations ON accounts.id = 
account_variations.account_id LEFT OUTER JOIN variations ON 
account_variations.variation_id = variations.id 
LEFT OUTER JOIN 
                        choice_value_variations ON variations.id = 
                        choice_value_variations.variation_id 
LEFT OUTER JOIN choice_values ON 
                        choice_value_variations.choice_value_id = choice_values.id LEFT OUTER 
                        JOIN choice_types ON choice_values.choice_type_id = choice_types.id 
                    LEFT 
                        OUTER JOIN choice_type_toys ON choice_type_toys.toy_id = toys.id 
    AND choice_type_toys.choice_type_id = choice_types.id 
    LEFT OUTER JOIN 
    (SELECT * FROM crosstab('SELECT accounts.id, choice_types.id, 
    choice_values.presentation FROM accounts\n                
        LEFT JOIN account_variations ON 
    accounts.id=account_variations.account_id\n                
        LEFT JOIN variations ON account_variations.variation_id=variations.id\n                
        LEFT JOIN choice_value_variations ON 
        variations.id=choice_value_variations.variation_id\n                
        LEFT JOIN choice_values ON 
        choice_value_variations.choice_value_id=choice_values.id\n                
        LEFT JOIN choice_types ON choice_values.choice_type_id=choice_types.id 
        ORDER BY 1,2',\n                       'select distinct choice_types.id 
        from choice_types JOIN choice_values ON choice_values.choice_type_id = 
        choice_types.id JOIN choice_value_variations ON 
        choice_value_variations.choice_value_id = choice_values.id JOIN 
        variations ON choice_value_variations.variation_id = variations.id JOIN choice_type_toys ON choice_type_toys.choice_type_id = choice_types.id JOIN toys ON toys.id = choice_type_toys.toy_id 
            where toys.id=12 ORDER 
                BY choice_types.id ASC')\n                
        AS (account_id int, xy_shirt 
                VARCHAR)) account_variation_view\n          ON 
                accounts.id=account_variation_view.account_id WHERE 
                \"accounts\".\"account_status\" = 'active' AND 
                \"addresses\".\"flagged_invalid_at\" IS NULL AND \"toys\".\"id\" = 12 
                AND (NOT EXISTS (SELECT \"account_skipped_months\".* FROM 
                \"account_skipped_months\" WHERE 
                \"account_skipped_months\".\"month_year\" = 'JUL2016' AND 
                (account_skipped_months.account_id = accounts.id)))"

在SELECT语句中使用DISTINCT的目的是消除重复行

由于缺乏格式,评估这段代码变得更加困难。正如下面的答案所述,需要使用distinct来删除重复项。当主表或主表与其他位置的多行相关时,会发生重复。在复制和粘贴到StackOverflow中时,是否有一种简单的方法格式化非换行SQL?没有。遗憾的是,您必须手动执行此操作。至于您最初的问题,您的一个或多个联接表中可能有多个帐户行。我首先看一下where子句中的内联视图-selects。不调试每个连接就很难诊断。但是,唯一的方法是复制某些连接,而不复制其他连接,因为对于一个连接或另一个连接,有两行。我可能会使用导致问题的braintree\u account\u id,并通过将其添加到相应的where子句来调试查询。@Nona您能否澄清“其他玩具系列”的含义?请不要将此视为责备,但您最初的问题给读者留下了“distinct”不被理解的印象。我正在为Shayna平整场地。文本中的细微差别是很难理解的——比如表情——而且很容易被误解,所以没有任何指责。