Я хотел бы спросить, есть ли способ изменить инструкцию SQL Select, чтобы предотвратить избыточные строки, как показано ниже.Резервные строки в SQL Select with Join
SELECT tblIssueCommsItem.ItemID, cardNo, tblIssueCommsEqp.currentQty FROM tblIssueCommsItem
INNER JOIN tblCommsItem ON tblIssueCommsItem.ItemID = tblCommsItem.ItemID
INNER JOIN tblIssueCommsEqp ON tblIssueCommsItem.EqpID = tblIssueCommsEqp.EqpID
INNER JOIN tblSetInfo ON tblSetInfo.EqpID = tblIssueCommsEqp.EqpID
WHERE SetID = 11 AND (cardNo = 'TK 14' OR cardNo = '') AND cardNo != 'Unassigned'
AND tblIssueCommsItem.VoucherNo = 10006102 AND tblIssueCommsEqp.currentQty > 0
ORDER BY cardNo, serial
Что я получаю:
ItemID: 1386, cardNO: *blank*, currentQty: 10
ItemID: 1386, cardNO: *blank*, currentQty: 1
ItemID: 1387, cardNO: *blank*, currentQty: 10
ItemID: 1387, cardNO: *blank*, currentQty: 1
ItemID: 1101, cardNO: TK 14, currentQty: 10
ItemID: 1101, cardNO: TK 14, currentQty: 1
ItemID: 2575, cardNO: TK 14, currentQty: 10
ItemID: 2575, cardNO: TK 14, currentQty: 1
SetInfo
содержит различные EqpIDs
, которые принадлежат к набору. В этом случае набор из SetID
11. То, что я хочу, чтобы достичь является следующее:
ItemID: 1386, cardNO: *blank*, currentQty: 10
ItemID: 1387, cardNO: *blank*, currentQty: 10
ItemID: 1101, cardNO: TK 14, currentQty: 10
ItemID: 2575, cardNO: TK 14, currentQty: 10
я понял, лишние строки происходит только когда у меня есть более чем на 1 пункт в комплекте чего cardNO = 'TK 14'
. Как вы можете видеть, избыточные строки - это номера currentQty = 1
. В моей базе данных нет такой записи. Я думаю, что это показано только 1, потому что это поле int
. Поскольку currentQty
отличается от других, это не дубликаты строк, поэтому я не могу использовать DISTINCT
, чтобы избавиться от него.
Мое понятие JOIN
нехорошо, но я пробовал все виды JOIN
и производит одинаковые результаты.
Любая помощь оценена!
ОБНОВЛЕНИЕ: ПРОБЛЕМА РЕШАЕТ. Благодаря людям, которые разъясняют поведение SQL, не предоставляя целое число по умолчанию. tblIssueCommsEqp.*
, помог мне определить виновника и понял, что мне нужны оба tblIssueCommsEqp.VoucherNo = 10000602 and tblIssueCommsItem.VoucherNo = 1000602
, чтобы получить то, что я хочу.
Как мои концепции все еще слабы, я все еще не уверен, почему, хотя, если у меня есть только 1 элемент «TK 14» в комплекте, все работает нормально.
Для ответов, которые помогли внести поправки в мое заявление, они могут также работать, но они являются своего рода обманом, и я буду использовать его только в качестве последнего средства.
Там должно быть строка (ы) в tblIssueCommsEqp, которые имеют currentQty = 1, если что приходит к результату. Если вы добавите tblIssueCommsEqp. * В select, вы сможете выяснить, в какой строке. Кроме того, проверьте первичные ключи/уникальные ограничения в таблицах, чтобы проверить, отсутствует ли один из них в соединении. –
«избыточные строки - это те, у которых currentQty равно 1. В моей базе данных нет такой записи.'' Посмотрите еще раз: ** ** должно быть ** в базе данных, где 'currentQty = 1'. Даже если бы база данных просто заполнила целое число по умолчанию (которое она не делает), по умолчанию целое число равно 0, не 1. –
Спасибо за помощь, JamesZ и Joel. tblIssueCommsEqp. * для меня новичок, и это действительно помогло мне, так как у меня слишком много записей. Пожалуйста, напишите как ответ. – DxHito