Как исправить проблему SQL-запроса с двумя или более позициями, которые имеют один идентификатор - PullRequest
1 голос
/ 16 апреля 2019

У меня есть SQL-запрос, где я должен объединить три таблицы. Одним из них является таблица с данными счета-фактуры, она выглядит так:

СЧЕТ

ID CUSTOMER_NAME TAXID        NUMBER       LABEL   GUID
1  CUSTOMER1     8739281100   FV001/2019   1       04EABFB3-0B9D-4749-B99D-A4EBEE079633

ПОЛОЖЕНИЕ СЧЕТА

ID ID_INV   POSITION_NAME   COUNT
1  1        NAME1           3
2  1        NAME2           2,5

СТОЛ С ЭТИКЕТКОЙ

ID NAME     VALUE  GUID_INV
1  LABEL1   true   04EABFB3-0B9D-4749-B99D-A4EBEE079633

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

Это для Firebird 2.5.

SELECT 
a.ID,
a.GUID,
a.NUMBER,  
a.CUSTOMER_NAME,
b.COUNT,
(select usrd.LABEL from USER_FIELD_DEFS usrd 
where usrd.GUID_INV=a.GUID and (usrd.ID=1 and usrb.VALUE='true')) as LABEL_NAME
FROM INVOICE a
join POSITION_INVOICE b ON a.ID=b.ID_INV

Я хочу получить такой результат

1 04EABFB3-0B9D-4749-B99D-A4EBEE079633 FV001/2019 CUSTOMER1 3   LABEL1
1 04EABFB3-0B9D-4749-B99D-A4EBEE079633 FV001/2019 CUSTOMER1 2,5 LABEL1

Пожалуйста, помогите с этим. Я знаю, что решение может быть очень простым, но у меня есть некоторое затмение ума:)

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Это должно дать вам строки, которые вы хотите, основываясь на 3 таблицах, которые вы предоставили.Если существует вероятность того, что накладная не имеет позиции, просто замените внутреннее объединение на левое объединение

SELECT
I.[Id]
,I.[GUID]
,I.[NUMBER]
,I.[CUSTOMER_NAME]
,IP.[POSITION_NAME]
,L.[NAME]
FROM [INVOICE] I
INNER JOIN [IN_P] IP ON IP.ID_INV = I.Id
LEFT JOIN [LABEL] L ON L.[GUID_INV] = I.[GUID]
0 голосов
/ 16 апреля 2019

Вам просто не хватает еще одного join здесь. Предполагая, что USER_FIELD_DEFS - это то же самое, что TABLE WITH LABEL, который вы упомянули здесь

SELECT 
a.ID,
a.GUID,
a.NUMBER,  
a.CUSTOMER_NAME,
b.COUNT,
c.NAME
FROM INVOICE a
JOIN POSITION_INVOICE b ON a.ID=b.ID_INV
JOIN USER_FIELD_DEFS c ON c.GUID_INV = a.GUID AND c.ID=1 and c.VALUE='true'
...