2009-10-09 2 views
5

Я делаю выбор в MySQL с внутренним Нет дубликатов присоединитесь:в SQL запросе

SELECT DISTINCT tblcaritem.caritemid, tblcar.icarid 
FROM tblcaritem 
INNER JOIN tblprivatecar ON tblcaritem.partid = tblprivatecar.partid 
INNER JOIN tblcar ON tblcaritem.carid = tblcar.carid 
WHERE tblcaritem.userid=72; 

Иногда я получаю дубликаты tblcaritem.caritemid в результате. Я хочу убедиться, что никогда не получаю дубликаты tblcaritem.caritemid, но как я могу это сделать? Я пытался использовать DISTINCT, но он просто проверял, является ли вся строка дубликат, я хочу проверить только tblcaritem.caritemid, есть ли способ?

Извините, если я не объяснил это очень хорошо, я не лучший SQL-запросов.

+1

Если у вас разные икардиды для того же caritemid, что вы хотите сделать? ie which icarid – Mark

+0

Что такое точка с использованием префикса tbl для таблицы? Вам нужно было прочитать префикс tblcar, чтобы определить его как таблицу автомобилей? – Rodrigo

+0

Не могли бы вы разместить структуру своих таблиц? – Quassnoi

ответ

11

GROUP BY tblcaritem.caritemid

+1

Должно быть, я действительно устал, почему я этого не сделал? Его работа теперь благодарит! :-) – Martin

0

Если положить 2 поля в запросе SELECT DISTINCT, он будет возвращать строки, где сочетание из 2-х полей является уникальным, а не только там, где каждое поле является уникальным.

Вам нужно будет запустить 2 отдельных запроса, если вы хотите получить только уникальные результаты для каждого столбца.

4

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

CarItemId CarId 
--------- ----- 
1   1 
1   2 
1   3 
2   1 
2   2 
3   3 

Вы хотите уникальные CarItemIds без каких-либо дубликатов, а это означает, что вам также нужны уникальные CarIds - хорошо, у вас есть 3 CarIds, которые нужно выбрать SQL Server?

У вас нет особого выбора здесь, кроме агрегировать эти дополнительные CarIds прочь:

SELECT tblcaritem.caritemid, max(tblcar.icarid) 
FROM tblcaritem 
INNER JOIN tblprivatecar ON tblcaritem.partid = tblprivatecar.partid 
INNER JOIN tblcar ON tblcaritem.carid = tblcar.carid 
WHERE tblcaritem.userid=72 
GROUP BY tblcaritem.caritemid 
0

Вы могли бы сделать агрегатную функцию на другой строке ... что-то вроде макс или мин

SELECT tblcaritem.caritemid, max(tblcar.icarid) 
FROM tblcaritem 
INNER JOIN tblprivatecar ON tblcaritem.partid = tblprivatecar.partid 
INNER JOIN tblcar ON tblcaritem.carid = tblcar.carid 
WHERE tblcaritem.userid=72 
group by tblcaritem.caritemid;