2016-08-19 5 views
1

У меня есть 2 таблицы:Выберите значения из одной таблицы на основе конкретного значения другой таблицы Linq

  Location 
id | user_id | latitude | longitude| 
    1 | 2 | 11.32323 | 11.32323 | 
    2 | 3 | 12.32323 | 12.32323 | 
    3 | 4 | 21.32323 | 12.32323 | 

  Task 
id | user_id | status | 
    1 | 2 | 0 | 
    2 | 2 | 1 | 
    3 | 2 | 0 | 
    4 | 2 | 2 | 
    5 | 2 | 1 | 
    6 | 2 | 0 | 
    7 | 3 | 1 | 
    8 | 3 | 1 | 
    9 | 3 | 1 | 

Я хочу, чтобы выбрать все строки из таблицы расположения, в которых пользователи имеют

  • либо нет записи в таблице задач (например, user_id = 4)
  • или если записи существует, то все они must имеют статус равный 1 (например. user_id = 3).

В приведенном выше примере, user_id = 2 не должна быть выбрана потому, что она имеет строк в таблице задач со статусом, кроме 1.

Я не очень знакомы с SQL и LINQ, так что любая помощь будет оценена ,

Это ожидаемый результат:

  Result 
id | user_id | latitude | longitude| 
    2 | 3 | 12.32323 | 12.32323 | 
    3 | 4 | 21.32323 | 12.32323 | 
  • Местоположение с user_id = 2 было игнорировали, поскольку он имеет несколько строк в таблице задач со статусом, кроме 1.
  • Адреса с user_id = 3 был выбран, потому что все строки в таблице «Задачи» имеют статус = 1.
  • Местонахождение с user_id = 4 было выбрано, потому что не были в задачах таблицы с user_id нет строк = 4.
+0

Можете ли вы показать ваши классы сущностей? –

ответ

1

Глядя на вас требование может быть этого

select * from location 
where user_id not in (select distinct user_id from task) 
or user_id not in (select distinct user_id from task where status != 1); 
+0

На самом деле это не позволит выбрать user_id = 2, потому что в таблице задач есть записи со статусом = 1. –

+0

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

+0

См. Обновленный вопрос. Добавлен ожидаемый результат с объяснением выбора записей. Плюс не обязательно, но я был бы очень благодарен, если бы вы могли ответить на запрос linq. –

1

Ваших условия эквивалентны тому, что нет, не «1» значения не существует task. Я хотел бы написать это как:

select l.* 
from location l 
where not exists (select 1 from tasks where t.user_id = l.user_id and t.status = 1); 

Я предпочитаю not exists к not in потому not in отфильтрует все строки, если user_id когда-либо в tasksNULL.

0

Использование LEFT JOIN без суб- SELECT:

SELECT 
    l.id, 
    l.user_id, 
    l.latitude, 
    l.longitude 
FROM 
    Location l 
     LEFT JOIN Task t 
     ON l.user_id = t.user_id 
WHERE 
     t.id IS NULL /* No record in tasks table */ 
    OR (t.id IS NOT NULL AND l.status = 1) /* if records exists then all of them must have status equals to 1 */ 
Смежные вопросы