2015-04-15 3 views
0

Я хотел бы спросить, есть ли способ изменить инструкцию 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» в комплекте, все работает нормально.

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

+0

Там должно быть строка (ы) в tblIssueCommsEqp, которые имеют currentQty = 1, если что приходит к результату. Если вы добавите tblIssueCommsEqp. * В select, вы сможете выяснить, в какой строке. Кроме того, проверьте первичные ключи/уникальные ограничения в таблицах, чтобы проверить, отсутствует ли один из них в соединении. –

+0

«избыточные строки - это те, у которых currentQty равно 1. В моей базе данных нет такой записи.'' Посмотрите еще раз: ** ** должно быть ** в базе данных, где 'currentQty = 1'. Даже если бы база данных просто заполнила целое число по умолчанию (которое она не делает), по умолчанию целое число равно 0, не 1. –

+0

Спасибо за помощь, JamesZ и Joel. tblIssueCommsEqp. * для меня новичок, и это действительно помогло мне, так как у меня слишком много записей. Пожалуйста, напишите как ответ. – DxHito

ответ

0

, предполагающий SQL Server, что-то вроде:

group by tblIssueCommsItem.ItemID, cardNo, tblIssueCommsEqp.currentQty 
having max(tblIssueCommsEqp.currentQty) 

Не уверен, что будет работать с заказом на но должен получить вас в правильном направлении, надеюсь :)

0

Я думаю, что вы хотите:

SELECT 
    tblIssueCommsItem.ItemID, 
    cardNo, 
    MAX(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 = 100006102 
    AND tblIssueCommsEqp.currentQty > 0 
GROUP BY 
    tblIssueCommsItem.ItemID, 
    cardNo 
ORDER BY 
    cardNo 
0

Попробуйте это:

SELECT tblIssueCommsItem.ItemID, cardNo, q.currentQty 
FROM tblIssueCommsItem 
INNER JOIN tblCommsItem ON tblIssueCommsItem.ItemID = tblCommsItem.ItemID 
INNER JOIN 
(
    select EqpID, MAX(currentQty) as currentQty 
    from tblIssueCommsEqp 
    group by EqpID 
    having max(currentQty) > 0 
) q ON tblIssueCommsItem.EqpID = q.EqpID 
INNER JOIN tblSetInfo ON tblSetInfo.EqpID = tblIssueCommsEqp.EqpID 
WHERE SetID = 11 AND (cardNo = 'TK 14' OR cardNo = '') 
    AND tblIssueCommsItem.VoucherNo = 100006102 
    -- The below line is redundant, though it may still be useful in matching an index 
    -- AND cardNo != 'Unassigned' 
ORDER BY cardNo, serial 
0

Это может помочь. Я думаю, в то числе максимальной функции поможет и так как вы включаете максимальной встроенной функции, удалить tblIssueCommsEqp.currentQty> 0 условие в где положении.

SELECT tblIssueCommsItem.ItemID, cardNo, Max(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 = 100006102 
ORDER BY cardNo, serial;