2010-06-14 4 views
0

Я графический дизайнер, старающийся изо всех сил понять псевдонимы таблиц, но он не работает. Вот что я до сих пор:Пытается использовать псевдонимы таблиц в SQL

SELECT colours.colourid     AS colourid1, 
     combinations.manufacturercolourid AS colourmanid1, 
     colours.colourname    AS colourname1, 
     colours.colourhex     AS colourhex1, 
     combinations.qecolourid2   AS colouridqe2, 
     colours.colourid     AS colourid2, 
     colours.colourname    AS colourname2, 
     colours.colourhex     AS colourhex2, 
     colours.colourid     AS colourid3, 
     combinations.qecolourid3   AS colouridqe3, 
     colours.colourname    AS colourname3, 
     colours.colourhex     AS colourhex3, 
     colours.colourid     AS colourid4, 
     combinations.qecolourid4   AS colouridqe4, 
     colours.colourname    AS colourname4, 
     colours.colourhex     AS colourhex4, 
     combinations.coloursupplierid 
FROM combinations 
     INNER JOIN colours 
     ON colours.colourid = combinations.manufacturercolourid; 

Теперь, идея заключается в том, что в справочной таблице цветов, то идентификатор будет тянуть код цвета, шестигранник и имя из таблицы перекодировки, так что я могу тянуть код цвета , hex и имя для 4 цветов, которые я ищу. Я могу заставить это работать, но он только подтягивает первое имя, код и шестнадцатеричный код, и я просто не вижу, что я делаю неправильно.

+0

Положите его и разделите строки, которые чрезвычайно трудно читать –

+0

Возможно, вы захотите обновить вопрос с помощью образца 'SELECT *' из таблиц 'colours' и' combination', и вы также можете захотеть для обеспечения ожидаемого результата. –

ответ

3

Ваша проблема заключается в том, что вы связываете только одну запись из таблицы цветов, потому что у вас есть только один JOIN в вашем SQL. Эта запись будет соответствовать цвету, указанному производителем_colour_id.

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

Если я правильно понимаю вашу проблему правильно, решение (с использованием текущих структур таблиц) будет что-то подобное:

SELECT C1.colourid    AS colourid1, 
    CMB.manufacturercolourid  AS colourmanid1, 
    C1.colourname    AS colourname1, 
    C1.colourhex     AS colourhex1, 
    CMB.qecolourid2    AS colouridqe2, 
    C2.colourid     AS colourid2, 
    C2.colourname    AS colourname2, 
    C2.colourhex     AS colourhex2, 
    C3.colourid     AS colourid3, 
    CMB.qecolourid3    AS colouridqe3, 
    C3.colourname    AS colourname3, 
    C3.colourhex     AS colourhex3, 
    C4.colourid     AS colourid4, 
    CMB.qecolourid4    AS colouridqe4, 
    C4.colourname    AS colourname4, 
    C4.colourhex     AS colourhex4, 
    CMB.coloursupplierid 
FROM combinations CMB 
    LEFT OUTER JOIN colours C1 
    ON C1.colourid = CMB.manufacturercolourid 
    LEFT OUTER JOIN colours C2 
    ON C2.colourid = CMB.qecolourid2 
    LEFT OUTER JOIN colours C3 
    ON C3.colourid = CMB.qecolourid3 
    LEFT OUTER JOIN colours C4 
    ON C4.colourid = CMB.qecolourid4 

То, что здесь происходит, что я, связывающую таблицу Цвета четыре раза, один раз для каждый из полей colour_id в таблице комбинаций. Для этого мне нужно каждый раз псевдоним имени таблицы, чтобы я знал, какой из четырех возможных экземпляров цветов используется в списке возвращаемых столбцов. Кроме того, я использую OUTER JOINs в том случае, если один или несколько столбцов colour_id могут быть пустыми. Если это произошло с INNER JOINs, вся строка выпадет из набора результатов.

+0

Спасибо, я закончил с чем-то очень похожим, но по крайней мере я понимаю, что я сейчас делаю. – stephmoreland

3

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

SELECT 
    cl.colourid     AS colourid1, 
    cb.manufacturercolourid AS colourmanid1, 
    cl.colourname    AS colourname1, 
    ... and so on..... 
FROM 
    combinations AS cb 
INNER JOIN 
    colours AS cl ON cl.colourid = cb.manufacturercolourid; 

Определяя таблицы псевдонима cb для таблицы combinations, вы можете использовать этот короткий псевдоним в селектах и другие части вашего заявления, вместо того, чтобы всегда указывать имя всей таблицы.

Но ваша проблема на самом деле в JOIN - вы только присоединиться один раз, пока вы ожидаете получить четыре результата назад ....

Что вам нужно сделать, это что-то вроде этого:

SELECT 
    col1.colourid   AS colourid1, 
    cb.manufacturercolourid AS colourmanid1, 
    col1.colourname   AS colourname1, 
    col1.colourhex   AS colourhex1, 

    cb.qecolourid2   AS colouridqe2, 
    col2.colourid   AS colourid2, 
    col2.colourname   AS colourname2, 
    col2.colourhex   AS colourhex2, 
    col2.colourid   AS colourid3, 

    cb.qecolourid3   AS colouridqe3, 
    col3.colourname   AS colourname3, 
    col3.colourhex   AS colourhex3, 
    col3.colourid   AS colourid4, 

    cb.qecolourid4   AS colouridqe4, 
    col4.colourname   AS colourname4, 
    col4.colourhex   AS colourhex4, 
    cb.coloursupplierid 
FROM 
    combinations cb 
INNER JOIN colours AS col1 ON col1.colourid = cb.manufacturercolourid 
INNER JOIN colours AS col2 ON col2.colourid = cb.qecolourid2 
INNER JOIN colours AS col3 ON col3.colourid = cb.qecolourid3 
INNER JOIN colours AS col4 ON col4.colourid = cb.qecolourid4 
2

Это не исчерпывающий ответ, но ваша проблема связана с тем, как вы используете JOINs. Табличные и столбчатые псевдонимы не влияют на выходной результирующий набор.

Вы выбираете одинаковые имена полей четыре раза, и именно поэтому вы получаете странные результаты.

+2

Да. Как предложено в комментариях «вопрос», перечислены описания столбцов в двух таблицах, строка или три образца данных из каждого и пример строк/столбцов, которые вы хотели бы вернуть. –

0

Это все замечательно, но по какой-то причине, когда я пытаюсь использовать их, я получаю сообщение об ошибке на странице:

[ODBC Microsoft Access Driver] Синтаксис ошибок (отсутствует оператор) в выражении запроса [Microsoft]

Я думаю, что я понимаю, как использовать псевдонимы таблицы сейчас, но по какой-то причине, хотя я уверен, что он должен работать, страница ему не нравится.

Смежные вопросы