Запрос SQL UNION с дополнительным полем в результатах - PullRequest
4 голосов
/ 01 мая 2011

У меня есть SQL-запрос, который работает хорошо, за исключением того, что я хотел бы привести результаты другого столбца в первом БД с ним.Это то, что у меня сейчас есть:

SELECT parts1.PART_NBR, parts1.NIIN
FROM parts1
WHERE parts1.PART_NBR='$pn'
UNION
SELECT parts2.REFERENCE_NUMBER, parts2.NIIN
FROM parts2
WHERE parts2.REFERENCE_NUMBER='$pn'

Это то, что я в основном хочу (конечно, это не будет работать):

SELECT parts1.PART_NBR, parts1.NIIN, parts1.ANOTHER_FIELD
FROM parts1
WHERE parts1.PART_NBR='$pn'
UNION
SELECT parts2.REFERENCE_NUMBER, parts2.NIIN
FROM parts2
WHERE parts2.REFERENCE_NUMBER='$pn'

Как мне написать запрос, чтобы он выполнялто же самое, но на самом деле возвращает дополнительное поле в результатах?

Ответы [ 4 ]

5 голосов
/ 01 мая 2011

Создайте пустое поле, возвращая NULL

SELECT parts1.PART_NBR, parts1.NIIN, parts1.ANOTHER_FIELD
FROM parts1
WHERE parts1.PART_NBR='$pn'
UNION ALL
SELECT parts2.REFERENCE_NUMBER, parts2.NIIN, NULL AS ANOTHER_FIELD
FROM parts2
WHERE parts2.REFERENCE_NUMBER='$pn'

РЕДАКТИРОВАТЬ: Из вашего комментария вы видите результаты как

Part Number: 21223 NIIN: 008194914 Name: CAPACITOR
Part Number: 21223 NIIN: 011241926 Name: HEAT SINK
Part Number: 21223 NIIN: 003901600 Name: KNIFE
Part Number: 21223 NIIN: 003901600 Name: 
Part Number: 21223 NIIN: 008194914 Name:
Part Number: 21223 NIIN: 011241926 Name:

Первые результаты приходятиз таблицы parts1 второй из parts2, пустые поля Name - это то, куда вы возвращаете NULL.

Из предоставленной вами информации я не понимаю, почему вы используетеUNION чтобы получить результаты из этих двух таблиц, поскольку они, похоже, содержат одинаковую информацию, за исключением того, что в первой таблице также есть поле Name.

Не лучше ли было бы JOIN таблиц наНомер детали / номер ссылки для выбора имени?

РЕДАКТИРОВАТЬ: Как вы сказали в своем комментарии, ранее вы получали DISTINCT набор результатов из-за использования UNION.С полем NULL строки больше не являются уникальными, и запрос возвращает все строки.

Я сказал в комментарии, что я не вижу, что текущий оператор UNION делает для вас, так как он выглядит так жеИнформация в обеих таблицах.В этом запросе есть что-то большее, чем то, что вы нам сказали?

2 голосов
/ 01 мая 2011
SELECT parts.PART_NBR, parts.NIIN, parts1.ANOTHER_FIELD
FROM  (
        SELECT parts1.PART_NBR, parts1.NIIN
        FROM parts1
        WHERE parts1.PART_NBR = '$pn'
        UNION
        SELECT parts2.REFERENCE_NUMBER, parts2.NIIN
        FROM parts2
        WHERE parts2.REFERENCE_NUMBER =  '$pn'
      ) AS parts(PART_NBR, NIIN)
  LEFT OUTER JOIN parts1
    ON parts.PART_NBR = parts1.PART_NBR AND
       parts.NIIN = parts1.NIIN      
0 голосов
/ 01 мая 2011

Вы должны иметь соответствующие столбцы, однако вы можете поместить «поддельный» столбец во второй, который возвращается null или любое другое значение по умолчанию.

SELECT parts1.PART_NBR, parts1.NIIN, parts1.ANOTHER_FIELD
FROM parts1
WHERE parts1.PART_NBR='$pn'
UNION
SELECT parts2.REFERENCE_NUMBER, parts2.NIIN, NULL AS ANOTHER_FIELD
FROM parts2
WHERE parts2.REFERENCE_NUMBER='$pn'
0 голосов
/ 01 мая 2011

Просто, как показано ниже:

select part_number, niin, max(field)
from (     
    SELECT parts1.PART_NBR part_number, parts1.NIIN niin, parts1.ANOTHER_FIELD field
    FROM parts1
    WHERE parts1.PART_NBR='$pn'
    UNION
    SELECT parts2.REFERENCE_NUMBER part_number, parts2.NIIN niin, "" field
    FROM parts2
    WHERE parts2.REFERENCE_NUMBER='$pn')
group by part_number, niin

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

...