Попытка использовать псевдонимы таблиц в SQL - PullRequest
0 голосов
/ 15 июня 2010

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

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; 

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

Ответы [ 4 ]

3 голосов
/ 15 июня 2010

Ваша проблема в том, что вы связываете только одну запись из таблицы цветов, потому что у вас есть только один JOIN в вашем SQL.Эта запись будет соответствовать цвету, указанному factory_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 JOIN в том случае, если один или несколько столбцов colour_id могут быть пустыми.Если бы это произошло с INNER JOIN, вся строка выпадет из набора результатов.

3 голосов
/ 15 июня 2010

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

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, вы можете использовать этоболее короткий псевдоним в вашем SELECT и других частях вашего оператора, вместо того, чтобы всегда указывать полное имя таблицы.

Но ваша проблема действительно в 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 голосов
/ 15 июня 2010

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

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

0 голосов
/ 16 июня 2010

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

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

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

...