Как мне выполнить соединение MySQL и ограничить количество идентичных результатов для самой левой таблицы до 1? - PullRequest
0 голосов
/ 17 марта 2011

Мой запрос выглядит следующим образом

SELECT DISTINCT
    addr.`Linje-ID` as lineid,
    addr.`Sluttbruker` as companyname,
    addr.`Gate` as street,
    addr.`Husnr` as housenr,
    addr.`Postnr` as zip,
    addr.`Poststed` as location,
    loc.`UX_KOORDINAT` as coord_x,
    loc.`UY_KOORDINAT` as coord_y,
    loc.`ADRESSE_ID` as addr_id

FROM
    addresses addr INNER JOIN
    locationdata loc ON
        loc.`POSTSTED` = addr.`Poststed` AND
        loc.`POST_NR` = addr.`Postnr` AND
        loc.`GATENAVN` = UPPER(addr.`Gate`) AND
        loc.`HUSNUMMER` = addr.`Husnr`

Цель состоит в том, чтобы запрос возвращал КАЖДЫЙ результат в "адресах" с соответствующими данными из "locationdata" для каждого.Этот запрос делает это, но он также дублирует результат из "адресов" для каждого дополнительного совпадения, которое он находит в "locationdata".

Как я могу изменить свой запрос, чтобы он возвращал только все строки в "address"Linje-ID` - уникальный идентификатор)

Ответы [ 3 ]

0 голосов
/ 17 марта 2011

Вам необходимо решить, что делать с несколькими значениями, возвращаемыми для данной строки адресов, оборачивая столбцы из таблицы locationdata в агрегатные функции. Здесь я предположил, что вы просто хотели минимальное значение:

Select addr.Linje-ID as lineid
    , addr.Sluttbruker As companyName
    , addr.Gate As street
    , addr.Husnr As housenr
    , addr.postnr As zip
    , addr. poststed As location
    , Min( loc.UX_KOORDINAT ) As coord_x
    , Min( loc.UY_KOORDINAT ) As coord_y
    , Min( loc.adresse_id ) As addr_id
From addresses As addr
    Join locationdata As loc
        On loc.poststed = addr.poststed
            And loc.post_nr = addr postnr
            And loc.gatnavn = upper(addr.gate)
            And loc.husnummer = addr.husnr
Group By addr.Linje-ID
    , addr.Sluttbruker
    , addr.Gate
    , addr.Husnr
    , addr.postnr
    , addr. poststed

Добавление

Другое решение, которое даст больше логических результатов, чем указано выше (хотя не более логично без дополнительной информации), состоит в произвольном выборе строки данных о местоположении для каждого адреса. Для этого нам нужно знать имена столбцов первичного ключа. Здесь я предположил, что они называются "PrimaryKeyColumn"

Select addr.Linje-ID as lineid
    , addr.Sluttbruker As companyName
    , addr.Gate As street
    , addr.Husnr As housenr
    , addr.postnr As zip
    , addr. poststed As location
    , loc.UX_KOORDINAT As coord_x
    , loc.UY_KOORDINAT As coord_y
    , loc.adresse_id As addr_id
From addresses As A
    Join    (
            Select addr.PrimaryKeyColumn
                    , Min( loc.PrimaryKeyColumn ) As locid
            From addresses As addr
                Join locationdata As loc
                    On loc.poststed = addr.poststed
                        And loc.post_nr = addr postnr
                        And loc.gatnavn = upper(addr.gate)
                        And loc.husnummer = addr.husnr
            Group By addr.PrimaryKeyColumn
            ) As Z
        On Z.PrimaryKeyColumn = addr.PrimaryKeyColumn
Join locationdata As loc
    On loc.PrimaryKeyColumn = Z.locid
0 голосов
/ 17 марта 2011

ANSI-SQL совместимый

SELECT
    addr.Linje-ID as lineid,
    addr.Sluttbruker as companyname,
    addr.Gate as street,
    addr.Husnr as housenr,
    addr.Postnr as zip,
    addr.Poststed as location,
    loc.UX_KOORDINAT as coord_x,
    loc.UY_KOORDINAT as coord_y,
    loc.ADRESSE_ID as addr_id
FROM (
    SELECT
        addr.Linje-ID as lineid,
        addr.Sluttbruker as companyname,
        addr.Gate as street,
        addr.Husnr as housenr,
        addr.Postnr as zip,
        addr.Poststed as location,
        (SELECT MIN(ADRESSE_ID) ADRESSE_ID
         FROM locationdata loc
         WHERE loc.POSTSTED = addr.Poststed AND
            loc.POST_NR = addr.Postnr AND
            loc.GATENAVN = UPPER(addr.Gate) AND
            loc.HUSNUMMER = addr.Husnr)
    FROM addresses addr
) ADDR
INNER JOIN locationdata loc ON loc.ADRESSE_ID = ADDR.ADRESSE_ID
0 голосов
/ 17 марта 2011
SELECT 
    addr.`Linje-ID` as lineid,
    addr.`Sluttbruker` as companyname,
    addr.`Gate` as street,
    addr.`Husnr` as housenr,
    addr.`Postnr` as zip,
    addr.`Poststed` as location,
    loc.`UX_KOORDINAT` as coord_x,
    loc.`UY_KOORDINAT` as coord_y,
    loc.`ADRESSE_ID` as addr_id

FROM
    addresses addr INNER JOIN
    locationdata loc ON
        loc.`POSTSTED` = addr.`Poststed` AND
        loc.`POST_NR` = addr.`Postnr` AND
        loc.`GATENAVN` = UPPER(addr.`Gate`) AND
        loc.`HUSNUMMER` = addr.`Husnr`
GROUP BY addr.`Linje-ID`
...