2016-03-28 3 views
0

Добрый день, вы все! Не могли бы вы помочь мне? :)SQL-строки выбора с одинаковым значением столбца

DATABASE SAMPLE:

ID Catalog Code Description Type Supplier Supplier Code 

1 6083   TV LG 32 tv lg  ud28f1137ka-ga-i2-tr 
1 6083   TV LG 32 tv samsung asfb1145-ssd   # select it 
2 6129   Phone 5X phone apple  mics_rp 
2 6129   Phone 5X phone htc  nco_p13 961-x 
2 6129   Phone 5X phone nokia  n_41s 
3 6210   Friezer  agd samsung asfb1145-ssd   # found match 
                    it has the same 
                    `Supplier Code` 

выше ID присваивается Catalog Code. Все поля - VARCHAR, за исключением ID. Может быть пустым.

ЧТО Я ХОТЕЛ СДЕЛАТЬ:

Выберите Catalog Code = 6083 например и получить все другие Catalog CodesIF один из Supplier Codes то же самое.

Итак, я должен получить: Catalog Code = 6210 (последний ряд), потому что он имеет те же Supplier Code, что и 6083 (первая строка).

МОЯ ПОПЫТКА НИЗКАЯ:

SELECT a.* 
    FROM `TABLE` a 
    WHERE EXISTS 
     (SELECT 1 
      FROM `TABLE` b 
      WHERE b.`Catalog Code` = '6083' 
      AND (
        a.`Supplier Code` NOT IN ('') 
       AND a.`Supplier Code` IN b.`Supplier Code` 
       ) 
     ) 

НЕОБХОДИМОСТЬ УЛУЧШЕНИЕ КОНСТРУКЦИИ

Моя настоящая БД имеет более 100 000 строк. Я чувствую, что дизайн БД нуждается в улучшении, но какие?

INDEXES, PRIMARY KEY, вторая БД с FOREIGN KEY?

+0

Когда в каком столбце (столбцах) появляется 0, а когда появляется «?» В каком столбце (столбцах)? Всегда ли отображается идентификатор с тем же кодом? Всегда ли код всегда отображается с одним и тем же идентификатором? Ваш вопрос непонятен. Вы также используете «db», когда имеете в виду «таблицу». – philipxy

ответ

0

Я хотел бы написать запрос больше, как это:

select t.* 
from t 
where t.supplier_code in (select t2.supplier_code 
          from t t2 
          where t2.catalog_code = '6083' 
         ); 

Ваш код довольно странно. Почему у вас есть not in ('')? Это избыточно. Затем на втором in вам нужен список, а не значение столбца. На самом деле достаточно просто =.

Для обеспечения производительности вам нужен указатель на t(catalog_code, supplier_code).

+0

'NOT IN', потому что некоторые значения столбца - это пустые строки или 0, или я хотел бы что-то исключить - может быть, есть лучший способ сделать это. – SQLnoob

+0

Помню, когда мы присоединились. То были времена. – Strawberry

+0

Я знаю, что нужно использовать 'JOIN' - я просто не могу обернуть голову вокруг этой конкретной проблемы (соединить точки). Не могли бы вы нам помочь?:) – SQLnoob

0

Для этого конкретного вопроса, как насчет использования 2 таблицы.

1) содержит информацию каталога кода. (Сохранить каталог кода в качестве первичного ключа)

детали 2) Поставщика (сохранить ID в качестве первичной кнопочной 1,2,3)

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

+0

«ПЕРВИЧНЫЙ КЛЮЧ» должен быть уникальным, а «КАТАЛОГ КОДА» - нет. То же самое относится к 'ID' в этой БД. Но я могу добавить новый столбец 'PK_ID', но я не могу идти дальше в голову - что дальше? Вот почему я прошу о помощи :) – SQLnoob

+0

разделите таблицу на 3 таблицы. где 1-й будет иметь только код каталога, desc, type и ... В 2-й таблице будет ID-целое число, поставщик, код поставщика и ... 3-я таблица будет иметь код каталога и идентификатор поставщика –

+0

Чтобы все было ясно (я изучая его): 3-я таблица с «ИДЕНТИФИКАТОМ КОДА ПОСТАВЩИКА» как «ИНОСТРАННЫЙ КЛЮЧ», ссылаясь на «ПОСТАВЩИК КОДА» во 2-й таблице? – SQLnoob

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