Нет дубликатов в SQL-запросе

Я делаю выбор в MySQL с внутренним соединением:

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-запросах.


person Martin    schedule 09.10.2009    source источник
comment
Если у вас есть разные икардиды для одного и того же каритемида, что вы хотите доу? то есть какой icarid   -  person mmmmmm    schedule 09.10.2009
comment
Какой смысл использовать префикс tbl для таблицы? Вам нужно было прочитать префикс tblcar, чтобы идентифицировать его как таблицу автомобилей?   -  person Rodrigo    schedule 09.10.2009
comment
Не могли бы вы опубликовать структуру ваших таблиц?   -  person Quassnoi    schedule 09.10.2009


Ответы (4)


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

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

Вам нужны уникальные идентификаторы CarItemId без дубликатов, а это означает, что вам также нужны уникальные идентификаторы CarId -- хорошо, у вас есть 3 идентификатора CarId, какой из них должен выбрать 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
person Juliet    schedule 09.10.2009

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

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

person Bork Blatt    schedule 09.10.2009

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

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;
person jle    schedule 09.10.2009

person    schedule
comment
Должно быть, я очень устал, почему я этого не сделал? Теперь работает, спасибо! :-) - person Martin; 17.10.2009