2013-12-26 4 views
1

У меня есть следующие таблицы:SQLite ошибки в объединяемых таблицах

PRAGMA foreign_keys = ON; 

CREATE TABLE products(
    '_id' INTEGER PRIMARY KEY AUTOINCREMENT, 
    'name' VARCHAR(20), 
    'price' INTEGER 
); 

CREATE TABLE orders(
    '_id' INTEGER PRIMARY KEY AUTOINCREMENT, 
    'order_number' INTEGER, 
    'order_sum' INTEGER 
); 

CREATE TABLE ord_details(
    '_id' INTEGER PRIMARY KEY AUTOINCREMENT, 
    'order_id' INTEGER, 
    'product_id' INTEGER, 
    'product_count' INTEGER, 
    FOREIGN KEY (order_id) REFERENCES orders(_id) ON DELETE CASCADE ON UPDATE CASCADE, 
    FOREIGN KEY (product_id) REFERENCES products(_id) ON DELETE CASCADE ON UPDATE CASCADE 
); 

CREATE TABLE ord_times(
    '_id' INTEGER PRIMARY KEY AUTOINCREMENT, 
    'order_id' INTEGER, 
    'start_t' TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    'end_t' TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    FOREIGN KEY (order_id) REFERENCES orders(_id) ON DELETE CASCADE ON UPDATE CASCADE 
); 

Таким образом, в таблицах имеют следующие данные:

В 'продукты' стола

--------------------- 
1 | roll  | 100 
2 | cheese  | 500 
3 | burger  | 300 
4 | mega burger | 550 

В «заказы ' стол

------------- 
1 | 11 | 600 

В 'ord_details' стол

-------------- 
1 | 1 | 1 | 1 
1 | 1 | 2 | 1 

В 'ord_times' стол

-------------------------------------------------------- 
1 | 1 | 12/23/2013 12:24:38 PM | 12/23/2013 12:27:02 PM 

, когда я выполнить эту команду SQL, и это дает неправильный результат:

SELECT orders.order_number, products.name as prname, products.price, ord_details.product_count, orders.order_sum, ord_times.start_t, ord_times.end_t FROM orders 
LEFT JOIN ord_details ON orders._id=ord_details.order_id 
LEFT JOIN products ON ord_details.product_id=products._id 
LEFT JOIN ord_times ON orders._id=ord_times.order_id 

Результаты :

----------------------------------------------------------------------------------- 
11 | roll  | 100 | 1 | 600 | 12/23/2013 12:24:38 PM | 12/23/2013 12:27:02 PM 
11 | cheese  | 500 | 1 | 600 | 12/23/2013 12:24:38 PM | 12/23/2013 12:27:02 PM 
11 | burger  | 300 | 0 | 600 | 12/23/2013 12:24:38 PM | 12/23/2013 12:27:02 PM 
11 | mega burger | 550 | 0 | 600 | 12/23/2013 12:24:38 PM | 12/23/2013 12:27:02 PM 

Я ожидаю, что в следующий результат:

----------------------------------------------------------------------------------- 
11 | roll  | 100 | 1 | 600 | 12/23/2013 12:24:38 PM | 12/23/2013 12:27:02 PM 
11 | cheese  | 500 | 1 | 600 | 12/23/2013 12:24:38 PM | 12/23/2013 12:27:02 PM 

Когда я выполняю этот код в SQLite-оболочки win32-x86-3080200 работает нормально:

enter image description here

но выполнить этот SQL в android возвращает неверный результат. Здесь вставив код:

INSERT INTO products (name, price) VALUES ("roll", 100); 
INSERT INTO products (name, price) VALUES ("cheese", 500); 
INSERT INTO products (name, price) VALUES ("burger", 300); 
INSERT INTO products (name, price) VALUES ("mega burger", 550); 
INSERT INTO orders (order_number, order_sum) VALUES (11, 600); 
INSERT INTO ord_details (order_id, product_id, product_count) VALUES (1, 1, 1); 
INSERT INTO ord_details (order_id, product_id, product_count) VALUES (1, 2, 1); 
INSERT INTO ord_times (order_id, start_t, end_t) VALUES (1,'12/23/2013 12:24:38 PM', '12/23/2013 12:27:02 PM'); 

Почему "ord_details.product_id = products._id" выражение не работает в Android?

+0

Hm [ваша точная установка, за исключением отсутствующей запятой в таблице заказов] (HTTP: //sqlfiddle.com/#!7/9dacc/1), кажется, дает ожидаемый результат. –

+0

@Joachim Isaksson вы правы Я ошибся, когда напишу вопрос в Stackoverflow –

+0

-1 То, что вы воспроизводите, невозможно. 'заказы LEFT JOIN ... products' не показывали бы непревзойденные' продукты', а только непревзойденные «заказы». Отправьте свой реальный SQL! Используйте [SQL Fiddle] (http://www.sqlfiddle.com) перед публикацией не возможных результатов. –

ответ

1

Попробуйте использовать JOIN вместо LEFT JOIN при вступлении в таблицу OrderDetails и продуктов, так что код будет выглядеть

SELECT orders.order_number, products.name as prname, products.price, 

ord_details.product_count, orders.order_sum, ord_times.start_t, ord_times.end_t FROM orders 

LEFT JOIN ord_details ON orders._id=ord_details.order_id 

JOIN products ON ord_details.product_id=products._id 

LEFT JOIN ord_times ON orders._id=ord_times.order_id 
Смежные вопросы