Используя SQLlite в сценарии TCL, у меня есть три таблицы:
DB eval { CREATE TABLE CompFIs ( EID int NOT NULL , PlyID int NOT NULL , LC int NOT NULL , FI float NOT NULL , SR float , ImagePath text , PRIMARY KEY ( LC, EID, PlyID )) }
DB eval { CREATE TABLE CompStresses ( EID int NOT NULL , PlyID int NOT NULL , LC int NOT NULL , sigx float , sigy float , sigxy float , PRIMARY KEY ( LC, EID, PlyID )) }
DB eval { CREATE TABLE ElemMetadata ( EID int NOT NULL , AssyID int NOT NULL , PID int , PRIMARY KEY ( EID )) }
Теперь я хочу узнать максимальный FI из первой таблицы «CompFIs» для данного AssID. Для этого FI (индекс отказа) мне нужны соответствующие значения из других таблиц. Чтобы добиться этого, я подумал, что присоединяюсь к таблицам, используя первичные ключи.
Однако я не нахожу, как присоединиться к таблицам, используя их ПК. Вместо этого я попробовал следующее:
SELECT
ElemMetadata.EID AS EID ,
ElemMetadata.AssyID AS AssyID ,
ElemMetadata.PID AS PID ,
CompFIs.PlyID AS Ply ,
CompFIs.LC AS LC ,
CompFIs.FI AS FI ,
CompFIs.SR AS SR ,
CompStresses.sigx AS sigx ,
CompStresses.sigy AS sigy ,
CompStresses.sigxy AS sigxy
FROM
CompFIs
LEFT JOIN CompStresses ON CompFIs.EID = CompStresses.EID
LEFT JOIN ElemMetadata ON CompFIs.EID = ElemMetadata.EID
WHERE AssyID = 1 ORDER BY FI DESC LIMIT 5
Это не работает, потому что данные сопоставляются только с использованием столбцов EID.
Как я могу присоединиться к таблицам на основе их Composite PK?
Примеры значений:
Table: CompFIs
--------------------------------------------------
EID PlyID LC FI SR ImagePath
--------------------------------------------------
282812 7 1 1.2824 null null
282813 2 3 0.3333 null null
Table: ElemMetadata
--------------------------------------------------
EID AssyID PID
--------------------------------------------------
282812 1 51
282813 1 51
Table: CompStresses
--------------------------------------------------
EID PlyID LC sigx sigy sigxy
--------------------------------------------------
282812 1 1 30.7 169.9 -31.13
282813 1 1 12.7 180.7 55.2
Expected output:
-------------------------------------------------------------------------------
EID AssyID PID Ply LC FI SR sigx sigy sigxy
-------------------------------------------------------------------------------
282812 1 51 1 1 1.2824 null 30.7 169.9 -31.13
Любая помощь приветствуется.
ПК и другие ограничения не нужны для запроса. Они просто заставляют больше выражений возвращать один и тот же ответ, который в противном случае не возвращался бы. Важно то, что означает строка в базовой таблице или результат запроса. «на основе их составных ПК» ничего нам не говорит. Предоставляя отношение (корабль)/ассоциацию или таблицу (базу или результат запроса), скажите, что строка в ней говорит о бизнес-ситуации с точки зрения значений ее столбца.





with cte as (
SELECT
ElemMetadata.EID AS EID ,
ElemMetadata.AssyID AS AssyID ,
ElemMetadata.PID AS PID ,
CompFIs.PlyID AS Ply ,
CompFIs.LC AS LC ,
CompFIs.FI AS FI ,
CompFIs.SR AS SR ,
CompStresses.sigx AS sigx ,
CompStresses.sigy AS sigy ,
CompStresses.sigxy AS sigxy
FROM
CompFIs
LEFT JOIN CompStresses ON CompFIs.EID = CompStresses.EID
LEFT JOIN ElemMetadata ON CompFIs.EID = ElemMetadata.EID
WHERE AssyID = 1
ORDER BY FI DESC LIMIT 5
)
select c.* from cte c
where not exists (
select 1 from cte
where FI > c.FI
)
Смотрите демо.
Полученные результаты:
| EID | AssyID | PID | Ply | LC | FI | SR | sigx | sigy | sigxy |
| ------ | ------ | --- | --- | --- | ------ | --- | ---- | ----- | ------ |
| 282812 | 1 | 51 | 7 | 1 | 1.2824 | | 30.7 | 169.9 | -31.13 |
Хорошо, я подумал, что есть способ напрямую использовать ПК. Однако я получаю NULL для sigx sigy sigxy. При поиске upp sigy sigy sigxy в таблице ComStresses есть значения для данной комбинации EID LC и PlyID.
Если бы было совпадение для всех трех столбцов, вы бы точно получили соответствующую строку. Так что проверьте еще раз. Вместо этого выполните SELECT * ..., чтобы проверить CompStresses.EID, CompStresses.LC, CompStresses.PlyID. Если они нулевые, то совпадения нет.
Я сделал. Проблема, как я понимаю, в том, что в таблице CompStresses нет столбца AssyID. Таким образом, WHERE AssyID=1 не создает совпадения в таблице CompStresses.
Удалите предложение WHERE и поместите условие в предложение ON. Смотрите мой отредактированный ответ.
Спасибо за ваши усилия. К сожалению, это все еще не работает. Я добавил примеры значений в вопрос, возможно, это поможет найти решение.
У вас нет соответствия всем 3 столбцам в обеих таблицах. Почему вы захотели присоединиться ко всем трем из них?
Точно так же вы присоединяетесь к любым столам на нескольких условиях...
... FROM foo JOIN bar ON foo.x = bar.x AND foo.y = bar.y AND foo.z = bar.z. В ваших таблицах нет строк с одинаковыми общими значениями PK, поэтому я не понимаю, как вы получаете эти конкретные результаты.